2016-12-12 3 views
1

Возможно ли, довольно легко, отсортировать массив объектов по массиву идентификаторов? Вот пример:Сортировка массива объектов по массиву идентификаторов

[{ 
    id: "A", 
    name: "John" 
}, { 
    id: "B", 
    name: "Bobby" 
}, { 
    id: "C", 
    name: "Peter" 
}] 

Теперь у меня есть массив объектов, каждый из которых имеет уникальный идентификатор. Я тогда массив идентификаторов так:

var ids = ["C", "A", "B"]; 

Можно ли сортировать массив объектов, так что в конце концов, как это:

[{ 
    id: "C", 
    name: "Peter" 
}, { 
    id: "A", 
    name: "John" 
}, { 
    id: "B", 
    name: "Bobby" 
}] 
+4

[ 'arr.sort ((а, б) => ids.indexOf (a.id)> ids.indexOf (b.id))'] (HTTPS: // jsfiddle.net/tusharj/2uqhnnqy/) – Tushar

+0

'data.sort (function (a, b) {return ids.indexOf (a.id)> ids.indexOf (b.id);})' – haim770

+0

Также см. [Сортировка массива (// stackoverflow.com/q/13518343), [Как отсортировать массив объектов на основе упорядочения другого массива?] (// stackoverflow.com/q/9755889), [ Сортировка массива объектов на основе другого массива идентификаторов] (// stackoverflow.com/q/35538509), [JavaScript - Сортировка массива на основе другого массива целых чисел] (// stackoverflow.com/q/4046967) – Tushar

ответ

1

Вы можете заказать его с объектом для порядок сортировки.

var data = [{ id: "A", name: "John" }, { id: "B", name: "Bobby" }, { id: "C", name: "Peter" }], 
 
    ids = ["C", "A", "B"], 
 
    order = {}; 
 

 
ids.forEach(function (a, i) { order[a] = i; }); 
 

 
data.sort(function (a, b) { 
 
    return order[a.id] - order[b.id]; 
 
}); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Если у вас есть только один и тот же объем id в ids массиве, то вы можете просто изменить массив с назначенными индексами без сортировки.

var data = [{ id: "A", name: "John" }, { id: "B", name: "Bobby" }, { id: "C", name: "Peter" }], 
 
    ids = ["C", "A", "B"], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    result[ids.indexOf(a.id)] = a; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }