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

按公共键对对象数组进行分组,将嵌套属性合并到数组中[duplicate]

穆远
2023-03-14

假设我有这个数组:

[
    {"type": "A",   "status": "CREATED",        "name": "Jack"}, 
    {"type": "A",   "status": "CREATED",        "name": "John"}, 
    {"type": "A",   "status": "UPDATED",        "name": "Alex"}, 
    {"type": "B",   "status": "UPDATED",        "name": "Jane"}
]

我想让一个新数组按“类型”和“状态”分组,并将名称列在一个列表中。这是所需的输出:

[
    {"type": "A",   "status": "CREATED",        "name-list": ["Jack", "John"]}, 
    {"type": "A",   "status": "UPDATED",        "name-list": ["Alex"]}, 
    {"type": "B",   "status": "UPDATED",        "name-list": ["Jane"]}
]

如您所见,数组的第一个对象包含两个名称,因为它们属于相同的“类型”和“状态”。(名称列表只是一个示例,也可以保留名称,重要的是它应该是字符串/对象的数组)

我必须在html页面中表示这些数据,因此需要能够通过JavaScript循环它们。

共有3个答案

缑高朗
2023-03-14
const arr = [
    {"type": "A",   "status": "CREATED",        "name": "Jack"}, 
    {"type": "A",   "status": "CREATED",        "name": "John"}, 
    {"type": "A",   "status": "UPDATED",        "name": "Alex"}, 
    {"type": "B",   "status": "UPDATED",        "name": "Jane"}
]

const res = arr.reduce((acc, cur) => {
  
  acc.forEach((obj, idx) => {
      if(obj.type == cur.type && obj.status == cur.status){
          acc[idx]["name-list"].push(cur.name)
      }
  })
  
  if(!acc.some(obj => obj["name-list"].includes(cur.name))){
      acc.push({type: cur.type, status: cur.status, "name-list": [cur.name]})
  }
  
  return acc
},[])

console.log(res)
林英武
2023-03-14

我会尝试使用。减少()。查找()

const data = [
    {"type": "A",   "status": "CREATED",        "name": "Jack"}, 
    {"type": "A",   "status": "CREATED",        "name": "John"}, 
    {"type": "A",   "status": "UPDATED",        "name": "Alex"}, 
    {"type": "B",   "status": "UPDATED",        "name": "Jane"}
];

const result = data.reduce((a, { type, status, name}) => {
  const found = a.find(e => e.type === type && e.status === status);
  
  if (found) {
    found['name-list'].push(name);
  } else {
    a.push({
      type,
      status,
      ['name-list']: [name]
    });
  }
  
  return a;
}, []);

console.log(result);
唐经国
2023-03-14

您可以使用数组遍历源数组。原型reduce()。然后提取Map。原型值()来自该映射

const src = [{"type":"A","status":"CREATED","name":"Jack"},{"type":"A","status":"CREATED","name":"John"},{"type":"A","status":"UPDATED","name":"Alex"},{"type":"B","status":"UPDATED","name":"Jane"}],

     result = [...src
        .reduce((r, o) => {
          const key = o.type+'\ud8ff'+o.status,
                match = r.get(key)
          match ? match.name.push(o.name) : r.set(key, {...o, name: [o.name]})
          return r
        }, new Map())
        .values()
      ]
      
console.log(result)
.as-console-wrapper{min-height:100%;}

 类似资料:
  • 这是我的输入,我有一个数组,其中名称键在多个对象中具有值“Foo1”,因此我希望在单独的数组中相对于“name”键值和其他信息的唯一对象。 下面的数组是唯一的名称键和其他值和状态键从所有匹配的对象存储在new_obj键。

  • 有人知道一种方法(如果可能的话也可以使用lodash)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组: 我想制作一个由分组的新汽车对象数组:

  • 问题内容: 我需要通过对象属性之一的一个属性比较对象数组。 我在做 : 它没有编译,有人知道怎么做吗? 谢谢。 问题答案: 这是代码中导致错误的部分 您可以创建对特定类型的任意对象的(静态或非静态)方法的引用。对任何类型的对象的方法的引用如下所示: 但是方法引用不是对象,并且没有成员可以访问。使用此代码,您尝试访问引用的成员变量(并且不能) 另外,方法引用不是类,因此您不能从它们中获取另一个方法引

  • 问题内容: 我有: 我想将其转换为该对象: 在Python中,有一个简单的习惯用法。jQuery或纯Javascript中是否有类似的东西,还是我必须做很长一段路? 问题答案: 简单的JS函数将是: 当然,您实际上也可以实现zip等功能,因为JS支持更高阶的类型,这使这些函数语言主义变得容易:D

  • 我有一个PHP对象数组,比如有两个属性和。所以比如说我可以做 数组当前使用每个对象的属性的值作为数组键,例如。 这样我就可以通过该属性快速查找对象。我现在需要通过快速查找,所以想要将键从设置为属性切换到设置为(两者都是唯一的)。 有简单的方法吗?就地或进入另一个数组都可以。

  • 我已经设法编写了一个使用Java8Streams API的解决方案,该解决方案首先按对象路由的值对其列表进行分组,然后对每组中的对象数进行计数。它返回映射路由->long。代码如下: 和路由类: 应转换为: 请注意,映射的键数为2条路由,它是lastUpdated值最大的一条。