2015-02-25 3 views
7

У меня есть массив с ключами, как так:Lodash коллекции сортировки на основе внешнего массива

['asdf12','39342aa','12399','129asg',...] 

и коллекция, которая имеет следующие ключи в каждом объекте, как так:

[{guid: '39342aa', name: 'John'},{guid: '129asg', name: 'Mary'}, ... ] 

Есть ли быстрое способ сортировки коллекции по порядку ключей в первом массиве?

+0

Какой язык вы использовали? – Angu

+0

Я использую javascript – silintzir

+0

@silintzir Пожалуйста, рассмотрите [принятие любого ответа] (http://meta.stackexchange.com/a/5235/235416), которые помогут вам больше всего. – thefourtheye

ответ

4

Вход:

var data1 = ['129asg', '39342aa']; 
var data2 = [{ 
    guid: '39342aa', 
    name: 'John' 
}, { 
    guid: '129asg', 
    name: 'Mary' 
}]; 
  1. Сначала создайте объект индекса, с _.reduce, как этот

    var indexObject = _.reduce(data2, function(result, currentObject) { 
        result[currentObject.guid] = currentObject; 
        return result; 
    }, {}); 
    
  2. А затем map пункты первого массива с объектами из indexObject, вот так

    console.log(_.map(data1, function(currentGUID) { 
        return indexObject[currentGUID] 
    })); 
    

Выход

[ { guid: '129asg', name: 'Mary' }, 
    { guid: '39342aa', name: 'John' } ] 

Примечание: Этот метод будет очень эффективным, если вы хотите, чтобы отсортировать так много объектов, потому что это уменьшит линейный просмотровые в секунду массив, который заставил бы всю логику выполняться во временной сложности O (M * N).

16
var sortedCollection = _.sortBy(collection, function(item){ 
    return firstArray.indexOf(item.guid) 
}); 
+0

Спасибо, вы это изящное решение – silintzir

+0

@silintzir. Вы спросили «быстрый способ сортировки коллекции» в вопросе. Но это не быстрый способ, если вы действительно имели в виду производительность во время выполнения. – thefourtheye

+1

Это прекрасно работает и является самым изящным решением, которое я нашел – Backer

2

Вы можете использовать indexBy() и at() отсортировать коллекцию. Преимущество заключается в том, что сжатый код и производительность. Использование sortBy() здесь делает трюк, но ваш внешний массив уже отсортирован:

var ids = [ 'cbdbac14', 'cf3526e2', '189af064' ]; 

var collection = [ 
    { guid: '189af064', name: 'John' }, 
    { guid: 'cf3526e2', name: 'Julie' }, 
    { guid: 'cbdbac14', name: 'James' } 
]; 

_(collection) 
    .indexBy('guid') 
    .at(ids) 
    .pluck('name') 
    .value(); 
// → [ 'James', 'Julie', 'John' ] 

Используя at(), вы можете перебрать отсортированный внешний сбор, создание новой коллекции от источника collection. Исходная коллекция была преобразована в объект с использованием indexBy(). Вы делаете это, так что() имеет доступ на основе ключа для каждого из них - ids.