【问题标题】:Join 3 JavaScript arrays by 2 keys?通过 2 个键连接 3 个 JavaScript 数组?
【发布时间】:2015-04-16 02:38:39
【问题描述】:

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

【问题讨论】:

    标签: javascript arrays merge lodash


    【解决方案1】:

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

    这将是非破坏性的,并且不会影响原始数组

    DEMO

    【讨论】:

      【解决方案2】:

      这是一个 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
      

      【讨论】:

      • 把当前地图改成.map(Function.apply.bind(_.merge, null))怎么样?
      • 好电话;这比我的干净一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多