【问题标题】:Merge objects in array based on property根据属性合并数组中的对象
【发布时间】:2017-04-07 14:58:11
【问题描述】:

我有一个这样的数组,我正在尝试合并,因此任何具有 name 属性的对象在合并后都将包含一个合并对象列表

var array = [ 
    {name: "One",
     myList: [Object1, Object2]
    },
    {name: "Two",
     myList: [Object3, Object4]
     },
     {name: "One",
     myList: [Object5, Object6]
     }
]

我如何合并两个“一个”对象,这样我就得到了类似的东西

var array = [ 
    {name: "One",
     myList: [Object1, Object2, Object5, Object6]
    },
    {name: "Two",
     myList: [Object3, Object4]
     }
]

希望在原版 javascript 中做到这一点

【问题讨论】:

    标签: javascript


    【解决方案1】:

    使用reduce:

    var merged = array.reduce(function(list, obj) {
        var found = false;
        for (var i = 0; i < list.length; i++) {
            if (list[i].name == obj.name) {
                list[i].myList = list[i].myList.concat(obj.myList);
                found = true;
                break;
            }
        }
    
        if (!found) {
            list.push(obj);
        }
    
        return list;
    }, []);
    

    【讨论】:

      【解决方案2】:

      首先,您可以删除重复的条目并组织myList 数组中的对象。然后,根据第一步中的有序对象返回一个具有指定键的对象数组。

      var array = [{name:"One",myList:['Object1','Object2']},{name:"Two",myList:['Object3','Object4']},{name:"One",myList:['Object5','Object6']}], obj = {};
      
      array.forEach(function(v) {
        obj[v.name] = (obj[v.name] || []).concat(v.myList)
      });
      
      var arr = Object.keys(obj).reduce(function(s,a) {
        s.push({name: a, myList: obj[a]});
        return s;
      }, []);
      
      console.log(arr);

      【讨论】:

      • 你可以试试obj[v.name] = (obj[v.name] || []).concat(v.myList)
      • @Rajesh 在 foreach 里面?
      • @Kinduser 是的。扩展运算符是 ES6 的一部分,并非在所有浏览器中都可用
      • @blu10 我认为其他一切都可以。您可以替换我在 forEach 中建议的代码,它应该很好
      【解决方案3】:

      使用Lodash 的另一种方法,仅使用chainreduce

      var array = [
          { name: "One", myList: ["Object1", "Object2"] },
          { name: "Two", myList: ["Object3", "Object4"] },
          { name: "One", myList: ["Object5", "Object6"] }
        ];
      
        const newArray = _.chain(array)
          .reduce((acc, currentValue) => {
            acc[currentValue.name] = (acc[currentValue.name] || []).concat(
              currentValue.myList
            );
            return acc;
          }, {})
          .reduce((acc, currentValue, key) => {
            acc.push({ name: key, myList: currentValue }); 
            return acc;
          }, [])
          .value();
      
        console.log(newArray);
      

      【讨论】:

        猜你喜欢
        • 2015-09-23
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 2018-12-25
        • 1970-01-01
        • 2020-02-29
        • 2022-01-18
        相关资源
        最近更新 更多