2016-05-05 5 views
0

У меня есть два массива. Первый - это просто список некоторых чисел, скажем, magicNumbers = [1,2,3,15,33]. Второй один массив объектов, все они имеют свойство magic, как это: magicObjects = [ { 'magic': 1 }, {'magic: 2}, {'magic': 15} ]Заполнение разреженного массива нулями (например, застежка на два массива)

Мне нужно создать новый массив, содержащий объекты из magicObject, в том же порядке, как стоимость magic собственности в magicNumbers массиве , а те места от magicNumbers, которые не имеют соответствующего объекта в magicObjects, должны быть заполнены null. В нашем примере, это должно дать: [ { 'magic': 1 }, {'magic: 2}, null, {'magic': 15}, null ]

Это довольно легко реализовать простым способом с _.map() и _.find():

_.map(magicNumbers, function(num) { return _.find(magicObjects, function(v) { return v.magic == num } ) || null; });

Любые идеи, как сделать это правильно в javascript-way, с помощью underscore.js или, может быть, более эффективным?

ответ

2

Обычно это делается путем заполнения карты id: object и получения объектов с карты по мере продвижения. Таким образом, вы получите N+M производительность вместо N*M:

console.info=function(x){document.write('<pre>'+JSON.stringify(x,0,3)+'</pre>')} 
 
//-- 
 

 
magicNumbers = [1,2,3,15,33]; 
 
magicObjects = [ { 'magic': 1 }, {'magic': 2}, {'magic': 15} ]; 
 

 
var mapping = {}; 
 
magicObjects.forEach(o => mapping[o.magic] = o); 
 

 
var result = magicNumbers.map(n => mapping[n] || null); 
 

 
console.info(result);

+0

Спасибо, что это справедливо в моем случае, так как магические значения являются уникальными (я просто использовать '_.indexBy' преобразовать массив карту) – saabeilin

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