按键组合json数组,javascript

按键组合json数组,javascript,javascript,arrays,json,node.js,algorithm,Javascript,Arrays,Json,Node.js,Algorithm,我需要组合两个json数组,由两个rest服务提供。具有相同“id”的条目属于一起 json1 = [{id:1,name:'aaa'}, {id:5,name:'ccc'}, {id:3,name:'bbb'} ]; json2 = [{id:3,parameter1:'x', parameter2:'y', parameter3:'z'}, {id:1,parameter1:'u', parameter2:'v', parameter3:'w'},

我需要组合两个json数组,由两个rest服务提供。具有相同“id”的条目属于一起

json1 = [{id:1,name:'aaa'},
     {id:5,name:'ccc'},
     {id:3,name:'bbb'}
   ];

 json2 = [{id:3,parameter1:'x', parameter2:'y', parameter3:'z'},
     {id:1,parameter1:'u', parameter2:'v', parameter3:'w'},
     {id:5,parameter1:'q', parameter2:'w', parameter3:'e'}
    ];
我需要一个javascript中的组合/复制/克隆json数组,其方式如下(我的angular2模型):

有没有办法把它们结合起来?参数名称没有精确定义,需要使用可变参数向量


我尝试了混合为每个循环。在我看来非常难看。

使用嵌套循环查找相应的元素并合并它们

for (var i = 0; i < json1.length; i++) {
    var id = json1[i].id;
    for (var j = 0; j < json2.length; j++) {
        if (json2[j].id == id) {
            for (var key in json2[j]) {
                json1[i][key] = json2[j][key];
            }
            break;
        }
    }
}
for(var i=0;i
最后,
json1
将包含组合元素


上面的代码假设
json2
的每个元素都与
json1
中的某个元素匹配。如果
json2
中可能有额外的元素,那么之后您需要额外的循环将这些元素复制到
json1

,这应该可以帮您完成。我希望代码本身就有意义。此示例始终将
json1
值置于
json2
值之上(如果两者都存在)。如果要更改该值,则需要切换最内层循环中的对象引用(
src[i]
obj[j]

//将接受src,并合并到obj的内容中。
//两者都需要一个对象数组。
//将src值保留为obj值。
功能扩展(src、obj){
//循环src,在本例中为json1
对于(变量i=0;i

如果您想编写它,以便可以接受任意数量的数组,而不是 只需2个,您可以利用,并执行以下操作:

var json1=[{id:1,名称:'aaa'},{id:5,名称:'ccc'},{id:3,名称:'bbb'}];
var json2=[{id:3,参数1:'x',参数2:'y',参数3:'z'},
{id:1,参数1:'u',参数2:'v',参数3:'w'},
{id:5,参数1:'q',参数2:'w',参数3:'e'}];
函数joinObjects(){
var idMap={};
//迭代参数
for(var i=0;i

.as console wrapper{max height:100%!important;top:0;}
以下是一种方法,您首先构建一个由id(稀疏数组)键控的索引,以检测并组合具有匹配id值的对象,然后将其连接回普通数组:

json3 = json1.concat(json2).reduce(function(index, obj) {
    if (!index[obj.id]) {
        index[obj.id] = obj;
    } else {
        for (prop in obj) {
            index[obj.id][prop] = obj[prop];
        }
    }
    return index;
}, []).filter(function(res, obj) {
    return obj;
});
json1=[
{id:1,名称:'aaa'},
{id:5,名称:'ccc'},
{id:3,名称:'bbb'}
];
json2=[
{id:3,参数1:'x',参数2:'y',参数3:'z'},
{id:1,参数1:'u',参数2:'v',参数3:'w'},
{id:5,参数1:'q',参数2:'w',参数3:'e'}
];
json3=json1.concat(json2).reduce(函数(索引,obj){
如果(!索引[obj.id]){
索引[obj.id]=obj;
}否则{
用于(obj中的道具){
索引[obj.id][prop]=obj[prop];
}
}
收益指数;
},[])。过滤器(功能(res,obj){
返回obj;
});
write(“”,JSON.stringify(json3,null,4),“”)两个一行程序:

使用lodash:

res = json2.map(x => Object.assign(x, json1.find(y => y.id == x.id)));
2015年欧洲标准:

    json1 = [
    {id:1, test: 0},
    {id:2, test: 0},
    {id:3, test: 0},
    {id:4, test: 0},
    {id:5, test: 0}
];

json2 = [
    {id:1, test: 1},
    {id:3, test: 1},
    {id:5, test: 1}
];

json1.map(x => Object.assign(x, json2.find(y => y.id == x.id)));

ES2015格奥尔格的答案非常有效

{id:1, test: 1},
{id:2, test: 0},
{id:3, test: 1},
{id:4, test: 0},
{id:5, test: 1}
结果:


使用forEach过滤器我们可以解决需求

vehiclaray1=[{id:1,名称:“a”},{id:2,名称:“b”},{id:3,名称:“c”}];
vehicleArray2=[{id:1,类型:“两轮车”},{id:2,类型:“四轮车”},{id:3,类型:“六轮车”}];
var-outArr=[];
VehiclerRay1.forEach(功能(值){
var existing=Vehiclary2.过滤器(功能(v,i){
返回(v.id==value.id);
});
if(现有长度){
value.type=现有[0]。类型;
输出推力(值)
}否则{
value.type='';
输出推力(值);
}
});
console.log(outArr)
让json1=[
{id:1,名称:'aaa'},
{id:5,名称:'ccc'},
{id:3,名称:'bbb'}
];
设json2=[
{id:3,参数1:'x',参数2:'y',参数3:'z'},
{ID:1,PAR
    json1 = [
    {id:1, test: 0},
    {id:2, test: 0},
    {id:3, test: 0},
    {id:4, test: 0},
    {id:5, test: 0}
];

json2 = [
    {id:1, test: 1},
    {id:3, test: 1},
    {id:5, test: 1}
];

json1.map(x => Object.assign(x, json2.find(y => y.id == x.id)));
{id:1, test: 1},
{id:2, test: 0},
{id:3, test: 1},
{id:4, test: 0},
{id:5, test: 1}