通过2个键连接3个JavaScript数组

Join 3 JavaScript arrays by 2 keys?

本文关键字:JavaScript 数组 3个 连接 2个 通过      更新时间:2023-11-19

1.连接这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}
]

这里有一个lodash解决方案。它本质上只是idyear上的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

使用一个由两个主键串联而成的临时对象作为属性名,您可以执行以下操作:

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]);
}

这将是非破坏性的,并保持原始阵列不变

DEMO