2013-02-10 6 views
0

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

Так у меня есть объект, например, так:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }]; 

Я тогда массив, который является «порядок», вот так:

var order = [2, 0, 1]; 

Я хочу использовать «заказ ', чтобы изменить порядок сбора в этом конкретном порядке. Я пытался найти несколько решений с функцией .sort, но я не могу найти тот, который подходит. Может ли кто-нибудь просветить меня? Наверное, я просто надеюсь.

+0

Не знаете, что вам нужно, но в таком простом случае вы можете заказать по индексу. – elclanrs

+0

Будьте осторожны с решениями, которые используют несколько непокрытых вызовов для 'indexOf', поскольку они будут включать в себя множество« порядок »много, много раз. – Dancrumb

ответ

5

Вы можете использовать метод sort() для достижения этой цели с помощью indexOf:

collection.sort(function(a, b){ 
    return order.indexOf(a.id) > order.indexOf(b.id); 
}); 
+0

Работал хорошо, спасибо! –

1

, кажется, так легко, как:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }]; 
var order = [2, 0, 1]; 
var sorted = []; 
for(var i=0,c=order.length;i<c;i++){ 
    sorted.push(collection[order[i]]); 
} 
+1

Я не думаю, что это делает то, что просит ОП. Это берет 'collection' и использует' order', чтобы сказать «перечислить третий, затем первый, затем второй из коллекции». Я думаю, что OP хочет «id списка: 2, затем id: 0, затем id: 1» – Dancrumb

1

Попробуйте это:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }]; 
var order = [2, 0, 1]; 
var sortedCollection = []; 
for (var i = 0; i < order.length; i++) 
    sortedCollection.push(collection[order[i]]); 
console.log(sortedCollection); 
2

Вы можете использовать функцию indexOf в массиве порядка в пользовательском т функция, как это:

collection.sort(function(x, y) { 
        return order.indexOf(x.id) > order.indexOf(y.id); 
       }); 
+0

Кажется, мне нужно набирать быстрее, @ozk быстрее меня :( – Styxxy

+1

StackOverflow - все о наборе маневренности :) – ozk

0

Вещь, которую Вы хотите, чтобы избежать здесь сканирования через любой из этих массивов больше, чем вы.

Вот одно решение, которое позволяет избежать этого:

/* 
* Map the indexes of the objects in collection to their final location 
*/ 
var sortIndex = {}; 
order.forEach(function(value, index) { 
    sortIndex[value] = index; 
}); 

/* 
* Put the objects in collection into their new, sorted collection 
*/ 
var sortedCollection = []; 
collection.forEach(function(value) { 
    var sortedLocation = sortIndex[value.id]; 
    sortedCollection[sortedLocation] = value; 

}); 

Таким образом, у нас есть один сканирование через каждый из массивов, сохраняя работу до минимума.

Я использовал forEach здесь для удобства; вы можете использовать библиотеку, такую ​​как Lodash или Underscore, или переписать ее, чтобы использовать явную итерацию по массивам.

Смежные вопросы