我需要结合由两个rest服务提供的两个json数组。具有相同“ 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'} ];
我需要以以下方式(我的模型在angular2中)在javascript中组合/复制/克隆json数组:
json3 = [{id:3,name:'bbb',parameter1:'x', parameter2:'y', parameter3:'z'}, {id:1,name:'aaa', parameter1:'u', parameter2:'v', parameter3:'w'}, {id:5,name:'ccc', parameter1:'q', parameter2:'w', parameter3:'e'} ];
有没有办法将它们结合起来?参数名称未完全定义,需要与可变参数向量一起使用。
我尝试了每个循环混合。在我看来非常难看。
如果要编写它以便可以接受任意数量的数组,而不仅仅是2个,则可以利用arguments,并执行以下操作:
var json1 = [{id:1,name:'aaa'},{id:5,name:'ccc'},{id:3,name:'bbb'}]; var 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'} ]; function joinObjects() { var idMap = {}; // Iterate over arguments for(var i = 0; i < arguments.length; i++) { // Iterate over individual argument arrays (aka json1, json2) for(var j = 0; j < arguments[i].length; j++) { var currentID = arguments[i][j]['id']; if(!idMap[currentID]) { idMap[currentID] = {}; } // Iterate over properties of objects in arrays (aka id, name, etc.) for(key in arguments[i][j]) { idMap[currentID][key] = arguments[i][j][key]; } } } // push properties of idMap into an array var newArray = []; for(property in idMap) { newArray.push(idMap[property]); } return newArray; } var json3 = joinObjects(json1, json2);
这是一个工作中的codepen。