按键分组对象数组 - 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 一起工作(正如评论指出的那样,0
和 1
是有效且“早期”的数组索引),您可能想使用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的主要内容,如果未能解决你的问题,请参考以下文章