当前位置: 首页 > 知识库问答 >
问题:

通过公共属性对对象进行分组,将其余属性合并为数组中的单独对象

柯振濂
2023-03-14

这是我的输入,我有一个数组,其中名称键在多个对象中具有值“Foo1”,因此我希望在单独的数组中相对于“name”键值和其他信息的唯一对象。

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

共有3个答案

董砚
2023-03-14

您可以使用lodash为其编写一个命令行程序

_.groupBy(array, 'name')
燕凯旋
2023-03-14
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;
}, {});
微生令
2023-03-14

您可以构建(例如,使用< code > array . prototype . reduce())< code > Map ,将< code>name值作为键,将对象分组作为值,因此,一旦您找到已经看到的< code>name (< code > Map . prototype . get()不会通过相应的键返回< code>undefined,您就可以将其余的属性作为单独的对象推送到< code>new_obj,如果遇到< code > name

当你的 Map 准备就绪时,你可以使用 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%;}
 类似资料:
  • 假设我有这个数组: 我想让一个新数组按“类型”和“状态”分组,并将名称列在一个列表中。这是所需的输出: 如您所见,数组的第一个对象包含两个名称,因为它们属于相同的“类型”和“状态”。(名称列表只是一个示例,也可以保留名称,重要的是它应该是字符串/对象的数组) 我必须在html页面中表示这些数据,因此需要能够通过JavaScript循环它们。

  • 问题内容: 通过多个属性对数组中的元素进行分组最符合我的问题,因为它确实通过数组中的多个键对对象进行了分组。问题是此解决方案无法汇总属性值,然后删除重复项,而是将所有重复项嵌套在二维数组中。 预期行为 我有一个对象数组,必须按和进行分组。 这个数组中的对象被视为重复仅当其和是相同的。如果它们是,我想分别总结它们的和值,然后删除重复项。 因此,在这个例子的结果阵列可以仅含有四种组合:,,, 问题 我

  • 问题内容: 如何通过匹配对象属性从数组中删除对象? 请只使用本机JavaScript。 我在使用接头时遇到麻烦,因为每次删除的长度都会减少。使用克隆并在原始索引上进行拼接仍然会给您带来长度减少的问题。 问题答案: 我以为你用过这样的东西? 修复bug所需要做的就是在下一次减少,然后(也可以选择向后循环): 为了避免线性时间删除,可以编写要 保留 在数组上的数组元素: 为了避免在现代运行时中进行线性

  • 按多个属性对数组中的元素进行分组最符合我的问题,因为它确实是按数组中的多个键对对象进行分组的。问题是,这种解决方案不求和属性值,然后删除重复项,而是将所有重复项嵌套在二维数组中。 预期行为 我有一个对象数组,必须按和分组。 此数组中的对象只有在它们的和相同时才被认为是重复的。如果是,我想分别总结它们的和值,然后删除重复项。 因此,在这个示例中,结果数组可能只包含四种组合:,,, 问题 我在这里尝试

  • 我有一个像下面这样的数组 现在我有了一个73如何从数组中选择这个特定的对象。我明白了,我可以在jQuery中用grep轻松实现这一点,有没有什么方法可以做到这一点? 由于大多数使用angular开发应用程序的用户总是从对象数组(主要用于表格)获取数据,因此应该有一个辅助函数来实现这一点? 这样我就可以通过更新对象的数组用行的ID来更改行的数据。 我不想把这件事牵扯进来。我想操作数据,并用函数更新数

  • 我需要使用特定对象的属性(