Javascript 使用下划线组合两个对象数组

Javascript 使用下划线组合两个对象数组,javascript,underscore.js,Javascript,Underscore.js,我有两个对象数组: var a = [{id:456, name:'sojuz'}, {id:751, name:'sputnik'}, {id:56, name:'arianne'}] var b = [{id:751, weight:5800}, {id:456, weight:2659}, {id:56, weight:6700}] 如何使用下划线将数组a扩展到新数组c中,从id属性相同的数组b添加权重属性: va

我有两个对象数组:

var a = [{id:456, name:'sojuz'},
         {id:751, name:'sputnik'},
         {id:56, name:'arianne'}]

var b = [{id:751, weight:5800},
         {id:456, weight:2659},
         {id:56, weight:6700}]
如何使用下划线将数组a扩展到新数组c中,从id属性相同的数组b添加权重属性:

var c = [{id:456, name:'sojuz', weight:2659},
         {id:751, name:'sputnik', weight:5800},
         {id:56, name:'arianne', weight:6700}]

这样的方法可以奏效,但肯定不是最佳的:

var c = [];
for(var i = 0; i < a.length; i++) {
   for (var j = 0; j < b.length; j++) {
      if(b[j].id == a[i].id) {
        var newC = {
          id: a[i].id,
          name: a[i].name,
          weight: b[j].weight
        }
        c.push(newC);
        break;
      }
   }
}
var c=[];
对于(变量i=0;i

但是,这确实有O(n^2)复杂性,我相信它可以优化。

这是使用下划线的一种方法:

var c = _.map(a, function(element) {
    var treasure = _.findWhere(b, { id: element.id });

    return _.extend(element, treasure);
});
如果你想摆弄它:

你可以将列表
a
和列表
b
中的每个索引(
.map
)对象映射到一个扩展对象(
.extend
)以生成一个合并对象列表

下面的解决方案利用了该库

var a=[
{id:456,名称:'sojuz'},
{id:751,名称:'sputnik'},
{id:56,名字:'arianne'}
];
变量b=[
{id:751,重量:5800},
{id:456,重量:2659},
{id:56,体重:6700}
];
函数合并列表(listA、listB、idField){
变量indexA=uxby.indexBy(a,idField)
var indexB=uxby.indexBy(b,idField);
返回映射(索引,函数(对象,键){
返回扩展(obj,indexB[key]);
});
}
var c=合并列表(a、b、id');
document.body.innerHTML=JSON.stringify(c,null,”)
正文{
空白:预处理;
字体系列:monospace;
}

使用ES6或使用带有多填充替换的ES5复制任何不带下划线的属性名称:

a.map(function (aItem) {
    var found = b.find(function (bItem) {
        if (aItem.id == bItem.id) return true;
    }) || {};

    Object.getOwnPropertyNames(found).map (function (property) {
        aItem[property] = found[property];
    });
});

我正在寻找使用下划线的答案,我不熟悉那个图书馆没问题!我想一旦你习惯了,这份文件就相当不错了it@AurélienThieriot:findWhere的
用法很好
!您的解决方案比我的快145%:-p@AurélienThieriot:我修改的解决方案现在快48%。)