【问题标题】:merge and group object properties in javascript在 javascript 中合并和分组对​​象属性
【发布时间】:2020-06-24 14:55:43
【问题描述】:

我有一个对象数组:

var test = [{name: 'lorem', age: 20, color:'red'}, {name: 'lorem', weight: 1, height:5} , {name: 'hello', ipsum : 'dolor'}]

我想将它们合并和分组。预期结果是:

var test = [{name: 'lorem', age : 20, color: 'red', weight : 1, height : 5}, {name: 'hello', ipsum : 'dolor'}]

解决方案可以是 vanilla、lodash 或 JQuery ...

编辑: 对不起,我忘了说它必须用 ES5 编写

编辑: 我几乎重写了 gorak 对 ES5 的提议。我尝试 _.clone 以避免使用传播运算符,但它不起作用

var r = _.values(_.reduce(test,function (acc, e) {
    acc[e.name] = {...(acc[e.name] || {}), ...e}; // this line is still in ES6
    return acc;
},{}));

【问题讨论】:

  • 如果有两个相同的属性名会怎样?
  • 这能回答你的问题吗? Merge 2 arrays of objects
  • @HereticMonkey> 如果两个属性相同,则必须用最后一个值重写属性。顺便说一句:您提供的链接不能解决我的问题,因为我只使用一个数组

标签: javascript object merge grouping


【解决方案1】:

您可以使用reduce 并使用Object.values。这是一个工作示例:

var test = [{name: 'lorem', age: 20, color:'red'}, {name: 'lorem', weight: 1, height:5} , {name: 'hello', ipsum : 'dolor'}];

var result = Object.values(test.reduce((acc, e)=>{
    acc[e.name] = {...(acc[e.name] || {}), ...e};
    return acc;
},{}));

console.log(result);

另一种方法是采用Set 值(唯一名称),然后使用Object.assign 合并过滤后的数组。试试这个:

var test = [{name: 'lorem', age: 20, color:'red'}, {name: 'lorem', weight: 1, height:5} , {name: 'hello', ipsum : 'dolor'}];

var result = [...new Set(test.map(({name})=>name))].map(n=>Object.assign(...test.filter(p=>p.name==n)));

console.log(result);

【讨论】:

    【解决方案2】:

    你可以使用下面的方法

    var test = [
      { name: 'lorem', age: 20, color: 'red' },
      { name: 'lorem', weight: 1, height: 5 },
      { name: 'hello', ipsum: 'dolor' },
    ]
    
    const finalResult = test.reduce((result, obj) => {
      if (result[obj.name]) {
        result[obj.name] = {
          ...result[obj.name],
          ...obj,
        }
      } else {
        result[obj.name] = { ...obj }
      }
      return result
    }, {})
    
    console.log(Object.values(finalResult))

    【讨论】:

      【解决方案3】:

      这个函数可以解决问题!

      name 放在每个对象的底部,但这没关系)
      (纯JS)

      function mergeList(list) {
        var temp = {};
        list.forEach(elem => {
          var name = elem.name;
          delete elem.name;
          temp[name] = {
            ...temp[name],
            ...elem
          }
        });
        var merged = [];
        Object.keys(temp).forEach(key => {
          var object = temp[key];
          object.name = key;
          merged.push(object);
        });
        return merged;
      }
      
      var test = [{
        name: 'lorem',
        age: 20,
        color: 'red'
      }, {
        name: 'lorem',
        weight: 1,
        height: 5
      }, {
        name: 'hello',
        ipsum: 'dolor'
      }];
      
      console.log(mergeList(test));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2021-12-21
        • 2021-03-29
        • 2019-11-14
        • 1970-01-01
        • 2018-05-02
        相关资源
        最近更新 更多