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%。)