按键分组对象数组 - javascript

Posted

技术标签:

【中文标题】按键分组对象数组 - javascript【英文标题】:Group array of object by key - javascript 【发布时间】:2021-02-23 11:46:10 【问题描述】:

之前,我确实在互联网上寻找过其他答案,但我仍然无法让它工作,我不知道为什么

所以,我有一个包含对象的数组:

array =[
   
      "name":"Alex",
      "id":0
   ,
   
      "age":20,
      "id":0
   ,
   
      "name":"John",
      "id":1
   ,
   
      "age":30,
      "id":1
   
]

我想根据他们的 id 对他们进行分组,所以我希望结果是这样的:

array =[
   [
      
         "name":"Alex",
         "id":0
      ,
      
         "age":20,
         "id":0
      
   ],
   [
      
         "name":"John",
         "id":1
      ,
      
         "age":30,
         "id":1
      
   ]
]

我找到了一堆可以使用类似方法的答案,所以我试了一下,但我不知道为什么它不起作用

 array.reduce((a, value) => 
       a[value.id] = [...a[value.id] || [], value];
        return a;
    , [])

谁能解释一下原因?

【问题讨论】:

获取任何“按属性分组的对象数组” 个重复项。它们几乎总是会返回一个对象 ( "0": [ ... ], "1": [ ... ] )。将此对象传递给Object.values(),您应该会得到预期的结果。 您刚刚进行的编辑使您的代码工作 - 虽然,它目前依赖于您的 ids 是从 0 连续增加的有效数组索引 【参考方案1】:

那是因为value.index 不存在所以它的值总是undefined

value.index 更改为value.id,它将按预期工作。

const array = [
    "name": "Alex",
    "id": 0
  ,
  
    "age": 20,
    "id": 0
  ,
  
    "name": "John",
    "id": 1
  ,
  
    "age": 30,
    "id": 1
  
];

const output = array.reduce((a, value) => 
  a[value.id] = [...a[value.id] || [], value];
  return a;
, []);
console.log(output);

【讨论】:

【参考方案2】:

您使用了错误的密钥-index,应更正为id

const array = [
    "name": "Alex",
    "id": 0
  ,
  
    "age": 20,
    "id": 0
  ,
  
    "name": "John",
    "id": 1
  ,
  
    "age": 30,
    "id": 1
  
]

const output = array.reduce((a, value) => 
  a[value.id] = [...a[value.id] || [], value];
  return a;
, [])

console.log(output);

【讨论】:

【参考方案3】:

在您的特定示例中,您的对象没有“索引”属性,因此当您调用value.index 时,您将获得undefined。如果您尝试使用 id 字段作为最终数组的索引(我认为您在该 reduce 函数中尝试使用该索引),请尝试以下操作。请注意,如果您的对象中没有从 0 开始的连续 id,那么您将在最终数组中插入空值。您可以通过对最终数组执行array.filter((el) => el ); 之类的操作来删除它们。

array.reduce((a, value) => 
  if (a[value.id]) 
    a[value.id].push(value);
   else 
    a[value.id] = [value];
  
  return a;
, []);

【讨论】:

【参考方案4】:

您实际上遇到了一个错字问题并通过编辑修复了它,但是如果您想让它与任意 ID-s 一起工作(正如评论指出的那样,01 是有效且“早期”的数组索引),您可能想使用Map,并在最后得到它的values()

const array = [
    "name": "Alex",
    "id": 80
  ,
  
    "age": 20,
    "id": 80
  ,
  
    "name": "John",
    "id": 100
  ,
  
    "age": 30,
    "id": 100
  
]

const map = array.reduce((a, value) => 
  a.set(value.id, [...a.get(value.id) || [], value]);
  return a;
, new Map())
const output = Array.from(map.values());

console.log(output);

【讨论】:

以上是关于按键分组对象数组 - javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何按键对一组对象进行分组?

javascript 按键从数组中删除对象。

javascript 按键对数组对象

javascript 如何在javascript数组中按键和值查找对象的索引

linq.js 按javascript中的对象数组分组

我如何分离每个 JSON 对象并将它们分组到 JavaScript 中的数组?