将JavaScript对象数组排序为特定顺序(使用现有函数)

给定一组对象:

 {key:“a”,值:42},{key:“d”,值:28},{key:“c”,值:92},{key:“b”,值:87} 

和一组键:

["c", "a", "b", "d"] 

是否有ECMAScript函数或第三方JavaScript库,允许您在一行/函数调用中排序第一个对象数组,以匹配第二个数组中指定的键的顺序,结果是:

 {
    关键:“c”,
    价值:92
 },
 {
    关键:“a”,
    价值:42
 },
 {
    关键:“b”,
    价值:87
 },
 {
    关键:“d”,
    价值:28
 }

提供function或算法的其他问题:

  • Javascript – 基于另一个数组排序数组 – Stack Overflow
  • javascript – 如何根据另一个数组的顺序对对象数组进行排序? – 堆栈溢出

相似/相关问题:

  • 按特定顺序对PHP中的对象数组进行排序
  • php – 排序对象数组

只需使用indexOf将密钥转换为正确的顺序:

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

小提琴

如果有很多键,那么从数组中创建一个哈希映射是有利的,例如:

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

这使得键排序查找恒定时间而不是O(n)。 ( 小提琴 )

到目前为止提供的答案很棒 认为以下也可能是普通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 ) ); 

我不能声称这是有效的方法,但您可以将每个对象的键用作另一个对象中属性的键。 然后只需通过这些键访问它们。

 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/