javascript - 如何根据键对数组进行分组并创建以分组数组为值的动态对象?
问题描述
我有多个items
,其中一些相同title
。我想创建一个多维数组,其中title
第一个键和一个唯一编号作为第二个键。因此可以按items
分类title
。
例子:
itemArray['title1'][0] = item1
itemArray['title1'][1] = item2
itemArray['title2'][0] = item3
我的示例正在使用此代码,但在我看来它很复杂,我希望 JavaScript 有另一种方法。
let itemArray = {}
items.forEach(item => {
let title = item['title']
if (itemArray[title] == null) {
itemArray[title] = {}
}
let index = Object.keys(itemArray[title]).length
itemArray[title][index] = item
},
)
输入:
[ RowDataPacket {
uid: 1,
title: 'booktitle',
description: 'description' },
RowDataPacket {
uid: 2,
title: 'booktitle',
description: 'description 2' },
RowDataPacket {
uid: 1,
title: 'booktitle 2',
description: 'description' } ]
预期输出(因为它是 sql 查询的结果,所以项目是 RowDataPacket):
{ 'booktitle':
{ '0':
RowDataPacket {
uid: 1,
title: 'booktitle',
description: 'description' } },
{ '1':
RowDataPacket {
uid: 2,
title: 'booktitle',
description: 'description 2' } },
'booktitle 2':
{ '0':
RowDataPacket {
uid: 1,
title: 'booktitle 2',
description: 'description' } }
}
使用 PHP 很容易,它的工作方式如下:
$itemArray = array();
foreach ($items as $key => $item) {
$itemArray[$item['title']][] = $item;
}
提前致谢!
解决方案
你有正确的想法。您创建的itemArray
不是多维数组。它是一个对象,每个对象都title
作为键,而数组的值与它们的值items
相同title
。你可能会forEach
像这样简化你的:
var items = [{
uid: 1,
title: 'booktitle',
description: 'description'
}, {
uid: 2,
title: 'booktitle',
description: 'description 2'
}, {
uid: 1,
title: 'booktitle 2',
description: 'description'
}]
let itemArray = {}
items.forEach(item => {
itemArray[item.title] = itemArray[item.title] || [];
itemArray[item.title].push(item)
})
console.log(itemArray)
检查是否itemArray
已经有title
as 键。如果是,请使用它。否则,将其指向一个空数组[]
。然后只是该属性push
的电流。item
使用reduce
,您甚至可以将其简化为:
var items=[{uid:1,title:'booktitle',description:'description'},{uid:2,title:'booktitle',description:'description 2'},{uid:1,title:'booktitle 2',description:'description'}]
let itemArray = items.reduce((acc,i) =>
((acc[i.title] = acc[i.title] || []).push(i), acc)
,{})
console.log(itemArray)
推荐阅读
- c - C 数组变量看起来不像指向第一个数组项的指针
- android - 让服务器拒绝来自使用不正确密钥签名的 Android 应用程序的 API 调用
- sql - 我正在尝试从另一个表中获取名称,外键在哪里
- sqlite - 在 SQLite Studio 中更新 CSV 表
- android - 两个 Firebase 只链接到一个 Google Cloud Platform?
- python - 为什么我不能在 ubuntu 中安装“seaborn”和“pandas”?
- javascript - 如何阻止人们分享您的网站页面链接?
- javascript - 我如何调用 add_to_cart jquery 函数到 php 以获取输入数量值
- netlogo - 如何找出 Y 发生的概率取决于 Netlogo 中的 X1 和 X2?Y , X1 和 X2 是海龟变量
- php - 为什么我不能在此查询中按名称排序?