javascript - 在对象数组中按公共属性分组项目
问题描述
我有两个大数组,一个是项目,另一个是拥有这些项目的名称。我需要将所有具有匹配项的名称推送到 array2 项中。
我可以通过嵌套 forEach 循环来做到这一点:
array1 = [
{item: "1", name: "Joe" },
{item: "2", name: "Sam" },
{item: "1", name: "Alice"},
{item: "3", name: "Peter"},
{item: "1", name: "Jack"},
]
array2 = [
{ item: "1", names: []},
{ item: "2", names: []},
{ item: "3", names: []},
]
array2.forEach(x => {
array1.forEach(y => {
if( x.item === y.item ){
x.names.push(y.name)
}
})
})
console.log(array2)
但我有一种感觉,这是一种不好的做法,更不用说大型阵列上的资源繁重了。
这样做的现代方法是什么?
解决方案
我相信,您最好利用以下优势Map
:
- 您可以使用
Array.prototype.reduce()
将源数组转换为关键Map
位置item
; - 遍历结果映射
Map.prototype.values()
以获取分组条目
const src = [
{item: "1", name: "Joe" },
{item: "2", name: "Sam" },
{item: "1", name: "Alice"},
{item: "3", name: "Peter"},
{item: "1", name: "Jack"},
],
result = [...src
.reduce((acc, {item,name}) => {
const group = acc.get(item)
group
? group.names.push(name)
: acc.set(item, {item, names:[name]})
return acc
}, new Map)
.values()
]
console.log(result)
推荐阅读
- sql - 如何在 SQL 中将一个表转换为另一个表(类似于数据透视,但不完全是)
- xamarin - 通过增量加载在 Xamarin.Forms ListView/CollectionView 上加载分组集合的最佳方式
- c++ - uwp:当应用程序处于挂起模式时如何下载文件
- python - fastai v2 如何在测试集上使用自定义变换执行推理
- c# - 从 C# 中订阅的事件的值求和到 int 变量
- .net - HTTP 请求未经客户端身份验证方案 Negotiate 授权。从服务器收到的身份验证标头是 Negotiate oX...Q=
- python - Python脚本 - 添加文件读取作为替代选项
- hosting - 域掩码的常用替代方法是什么?
- excel - 在 vba 中动态创建图像并为其添加点击功能
- javascript - 查询具有相同值的多个字段 [GraphQL][Amplify]