38

给定一个对象数组:

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

和一组键:

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

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

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

提供函数或算法的其他问题:

类似/相关问题:

4

5 回答 5

62

只需使用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)。(小提琴

于 2013-09-17T20:27:32.593 回答
28

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

于 2015-11-19T18:20:33.420 回答
7

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

于 2021-04-28T17:08:24.267 回答
3

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

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/

于 2013-09-17T20:32:23.857 回答
1
// 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])
于 2019-06-20T19:05:11.970 回答