将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);