通过 2 个键连接 3 JavaScript 个数组?
Join 3 JavaScript arrays by 2 keys?
1.What 是加入这 3 个数组的有效方法:(使用 lodash 等的示例是最受欢迎的)
[
{ id : "A", year : 1990, x : 10}
{ id : "B", year : 1990, x : 10}
]
[
{ id : "A", year : 1990, y : 100}
{ id : "B", year : 1990, y : 100}
]
[
{ id : "A", year : 1990, z : 1000}
{ id : "B", year : 2000, z : 1000}
]
得到这个结果:
[
{ id : "A", year : 1990, x : 10, y: 100, z: 1000}
{ id : "B", year : 1990, x : 10, y: 100, z: 1000}
{ id : "B", year : 2000, z : 1000}
]
使用将 2 个主键串联起来作为 属性 名称的临时对象,您可以执行以下操作:
var a= [
{ id : "A", year : 1990, x : 10},
{ id : "B", year : 1990, x : 10}
];
var b= [
{ id : "A", year : 1990, y : 100},
{ id : "B", year : 1990, y : 100}
];
var c= [
{ id : "A", year : 1990, z : 1000},
{ id : "B", year : 2000, z : 1000}
];
var tmp={},
arrs=[a,b,c]
arrs.forEach(function( mainArr){
mainArr.forEach(function(obj){
var combinedKeys= obj.id + obj.year;
if(!tmp[combinedKeys]){
tmp[combinedKeys] ={}
}
var keys = Object.keys(obj)
keys.forEach(function(key){
if(!tmp[combinedKeys].hasOwnProperty(key)){
tmp[combinedKeys][key]=obj[key] ;
}
});
});
});
var newArr=[];
for( key in tmp){
newArr.push(tmp[key]);
}
这将是非破坏性的,并保持原始数组不变
这是一个 lodash 解决方案。它本质上只是 id
和 year
上的 groupBy
,然后是将所有匹配对象合并在一起的映射。
//assuming your three arrays are "a", "b", and "c"
_(a).concat(b).concat(c) //begin lodash chaining syntax, join arrays
.groupBy(function(obj) { //group by the combination of the id and year
return obj.id + "|" + obj.year;
})
.map(Function.apply.bind(_.merge, null)) //merge array of objects matching id and year into a single object
.value() //end lodash chaining syntax
1.What 是加入这 3 个数组的有效方法:(使用 lodash 等的示例是最受欢迎的)
[
{ id : "A", year : 1990, x : 10}
{ id : "B", year : 1990, x : 10}
]
[
{ id : "A", year : 1990, y : 100}
{ id : "B", year : 1990, y : 100}
]
[
{ id : "A", year : 1990, z : 1000}
{ id : "B", year : 2000, z : 1000}
]
得到这个结果:
[
{ id : "A", year : 1990, x : 10, y: 100, z: 1000}
{ id : "B", year : 1990, x : 10, y: 100, z: 1000}
{ id : "B", year : 2000, z : 1000}
]
使用将 2 个主键串联起来作为 属性 名称的临时对象,您可以执行以下操作:
var a= [
{ id : "A", year : 1990, x : 10},
{ id : "B", year : 1990, x : 10}
];
var b= [
{ id : "A", year : 1990, y : 100},
{ id : "B", year : 1990, y : 100}
];
var c= [
{ id : "A", year : 1990, z : 1000},
{ id : "B", year : 2000, z : 1000}
];
var tmp={},
arrs=[a,b,c]
arrs.forEach(function( mainArr){
mainArr.forEach(function(obj){
var combinedKeys= obj.id + obj.year;
if(!tmp[combinedKeys]){
tmp[combinedKeys] ={}
}
var keys = Object.keys(obj)
keys.forEach(function(key){
if(!tmp[combinedKeys].hasOwnProperty(key)){
tmp[combinedKeys][key]=obj[key] ;
}
});
});
});
var newArr=[];
for( key in tmp){
newArr.push(tmp[key]);
}
这将是非破坏性的,并保持原始数组不变
这是一个 lodash 解决方案。它本质上只是 id
和 year
上的 groupBy
,然后是将所有匹配对象合并在一起的映射。
//assuming your three arrays are "a", "b", and "c"
_(a).concat(b).concat(c) //begin lodash chaining syntax, join arrays
.groupBy(function(obj) { //group by the combination of the id and year
return obj.id + "|" + obj.year;
})
.map(Function.apply.bind(_.merge, null)) //merge array of objects matching id and year into a single object
.value() //end lodash chaining syntax