jquery - Sorting an Array of JavaScript Objects a Specific Order (using existing function)

ID : 131384

viewed : 7

Tags : javascriptjqueryarrayssortingunderscore.jsjavascript

Top 5 Answer for jquery - Sorting an Array of JavaScript Objects a Specific Order (using existing function)

vote vote

100

Just use indexOf to convert the key to the correct order:

var order = ["c", "a", "b", "d"]; _.sortBy(arr, function(obj){      return _.indexOf(order, obj.key); }); 

Fiddle

If there are a lot of keys, then it would be advantageous to make a hash-map out of the array, like:

var order = ["c", "a", "b", "d"]; var orderMap = {}; _.each(order, function(i) { orderMap[i] = _.indexOf(order, i); }); 

This makes the key-sorting lookup constant time rather than O(n). (Fiddle)

vote vote

90

Great answers provided so far. Thought that the following may also be an alternative solution in plain JS:

var arr = arr.sort(function(a,b) {     return order.indexOf( a.key ) - order.indexOf( b.key );     //for the sake of recent versions of Google Chrome use:     //return a.key.charCodeAt(0) > b.key.charCodeAt(0); or return a.key.charCodeAt(0) - b.key.charCodeAt(0); }); 

var arr = [     {         key: "a",         value: 42     },     {         key: "d",         value: 28     },     {         key: "c",         value: 92     },     {         key: "b",         value: 87     } ];  var order = ["c", "a", "b", "d"];  console.log( 'Original: ', JSON.stringify( arr ) );  var arr = arr.sort(function(a,b) {       return order.indexOf( a.key ) - order.indexOf( b.key ); });  console.log( 'Ordered: ', JSON.stringify( arr ) );

vote vote

80

const obj = [     {         key: "a",         value: 42     },     {         key: "d",         value: 28     },     {         key: "c",         value: 92     },     {         key: "b",         value: 87     } ]   const sortList = ["c", "a", "b", "d"];           const sortedObj = obj.sort((a, b) => {     return (         sortList.indexOf(a.key) - sortList.indexOf(b.key)     ); });  console.log(sortedObj );

vote vote

60

I can't claim that this is the most efficient way, but you can use the key for each object as a key for properties in another object. Then simply access them by these keys.

for (x = 0; x < objn.length; x++) {     newobj[objn[x].key] = objn[x]; } objn = []; for (x = 0; x < keys.length; x++) {     objn.push(newobj[keys[x]]); } console.log(objn); 

http://jsfiddle.net/WdehF/

vote vote

54

// create hash map el.key -> index, to help us with direct access, avoid searching const hashMap = arr.reduce((acc, el, index) => { acc[el.id] = el; return acc }, {})  // finally, map the ids to the final result const ids.map(id => hashMap[id]) 

Top 3 video Explaining jquery - Sorting an Array of JavaScript Objects a Specific Order (using existing function)

Related QUESTION?