Подтвердить что ты не робот

Сортировка массива объектов JavaScript в конкретном порядке (с использованием существующей функции)

Учитывая массив объектов:

{
    key: "a",
    value: 42
},
{
    key: "d",
    value: 28
},
{
    key: "c",
    value: 92
},
{
    key: "b",
    value: 87
}

и массив ключей:

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

Есть ли функция ECMAScript или сторонняя библиотека JavaScript, которая позволяет сортировать - в одном вызове строки/функции - первый массив объектов, соответствует порядку ключей, указанный во втором массиве, так что результат:

{
    key: "c",
    value: 92
},
{
    key: "a",
    value: 42
},
{
    key: "b",
    value: 87
},
{
    key: "d",
    value: 28
}

Другие вопросы, которые предоставляют функцию или алгоритм:

Похожие/связанные вопросы:

4b9b3361

Ответ 1

Просто используйте indexOf, чтобы преобразовать ключ в правильный порядок:

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

Fiddle

Если есть много ключей, тогда было бы выгодно сделать хэш-карту из массива, например:

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

Это делает поиск по ключевым словам постоянным временем, а не O (n). (Fiddle)

Ответ 2

Отличные ответы, представленные до сих пор. Мысль о том, что следующим образом может быть альтернативное решение в простой 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 ) );

Ответ 3

Я не могу утверждать, что это наиболее эффективный способ, но вы можете использовать key для каждого объекта как ключ для свойств в другом объекте. Затем просто обращайтесь к ним с помощью этих клавиш.

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/

Ответ 4

// 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])