用空值填充稀疏数组(如压缩两个数组)

Filling a sparse array with nulls (like zipping two arrays)

我有两个数组。第一个只是一些数字的列表,比如 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 方式正确地使用 underscore.js,或者可能更有效?

通常这是通过填充地图 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);