【问题标题】:Group objects by common property merging the rest of properties as separate objects within array通过公共属性对对象进行分组,将其余属性合并为数组中的单独对象
【发布时间】:2020-08-12 13:26:07
【问题描述】:

这是我的输入,我有一个数组,其中名称键在多个对象中具有值“foo1”,所以我想要关于“名称”键值的唯一对象以及单独数组上的其他信息。

var array = [{
    name: "foo1",
    value: "val1",
    status: "1"
  }, {
    name: "foo1",
    value:  "val2",
    status: "0"
  }, {
    name: "foo1",
    value:  "val3",
    status: "1"
  }, {
    name: "foo2",
    value: "val4",
    status: "1"
  }];

我想要如下所示的输出。下面的数组在 new_obj 键上的所有匹配对象存储中按名称键和其他值和状态键是唯一的。

var output = [{
  name: "foo1",
  new_obj: [{
      value:"val1", 
      status: "1"
    }, {
      value:"val2", 
      status: "0"
    }, {
      value:"val3", 
      status: "1"
    }]
  }, {
    name: "foo2",
    new_obj: [{
      value:"val4", 
      status: "1"
    }]  
  }];

【问题讨论】:

标签: javascript


【解决方案1】:

您可以构建(例如使用Array.prototype.reduce()Map,将name 值作为键并将分组对象作为值,因此一旦您找到已经看到的nameMap.prototype.get() 不会通过各自的键返回undefined),将其余属性作为一个单独的对象推送到new_obj,如果遇到name之前没有见过,则为此创建(使用Map.prototype.set())分组对象。

当您的Map 准备就绪时,您可以使用spread syntax 将其与Map.prototype.values() 的值提取到数组中:

const arr = [{name:"foo1",value:"val1",status:"1"},{name:"foo1",value:"val2",status:"0"},{name:"foo1",value:"val3",status:"1"},{name:"foo2",value:"val4",status:"1"}],
    
    result = [...arr
      .reduce((acc, {name, ...rest}) => {
          const group = acc.get(name)
          group ? group.new_obj.push(rest) : acc.set(name, {name, "new_obj":[rest]})
          return acc
        }, new Map)
      .values()
    ]
    
console.log(result)
.as-console-wrapper{min-height:100%;}

【讨论】:

    【解决方案2】:
    var output = array.reduce((acc, value) => {
      if (!acc[value.name]) acc[value.name] = {
        name: value.name,
        new_obj: []
      };
      acc[value.name].new_obj.push({value: value.value, status: value.status});
      return acc;
    }, {});
    

    【讨论】:

      【解决方案3】:

      你可以使用 lodash 来实现这一点

      _.groupBy(array, 'name')
      

      【讨论】:

        猜你喜欢
        • 2020-11-12
        • 2021-08-21
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多