javascript - 按javascript中的字典列表分组
问题描述
输入 =
[{id: 13, display_name: "Customizable Desk (Aluminium, Black)", quantity: 4, unit_price: "800.40", discount: 0, price: "3201.60"},
{id: 40, display_name: "Magnetic Board", quantity: 2, unit_price: "1.98", discount: 0, price: "3.96"},
{id: 40, display_name: "Magnetic Board", quantity: 1, unit_price: "1.98", discount: 0, price: "1.98"},
{id: 40, display_name: "Magnetic Board", quantity: 1, unit_price: "1.98", discount: 0, price: "1.98"}]
输出 =
[{id: 13, display_name: "Customizable Desk (Aluminium, Black)", quantity: 4, unit_price: "800.40", discount: 0, price: "3201.60"},
{id: 40, display_name: "Magnetic Board", quantity: 4, unit_price: "1.98", discount: 0, price: "7.92"}]
我能够得到答案,但我的过程非常冗长,我需要使用一些预定义的 javascript 函数来简短回答。
解决方案
这是执行此操作的一种简短方法(基于我之前引用的假设,quantity
对于具有相同值的每个项目来说,唯一可能会有所不同id
):
inputArray.reduce((result, item) => {
if (result.map.has(item.id)) {
result.map.get(item.id).quantity += item.quantity;
} else {
result.array.push(item);
result.map.set(item.id, item);
}
return result;
}, {map: new Map(), array: []}).array
reduce
如果您不熟悉,这将使用数组函数。这可以在没有 的情况下完成Map
,但这比搜索整个结果数组以查找id
已经看到的值更有效。
这段代码背后的想法是,你保留你看到的第一个有一个id
你以前没有见过的项目,如果你以前看过一个id
,你查找那个原始项目,并将新数量添加到以前的数量。
推荐阅读
- php - 如何使用 JSON 获取非对象的属性
- javascript - 使用 jquery nearest() 和 find() 返回实际的 HTML 元素
- scripting - 将模式之间的第 4 个字段数据相加
- angular - 是否可以在 Angular 8 中定义功能前/后处理器?
- vba - VBA Outlook,保存电子邮件中的附件,但不保存电子邮件正文中的图像
- php - 类 Foo\Bar\Baz 位于 ./foo/bar/utility/baz.php 不符合 psr-4 自动加载标准。跳过
- sas - SAS大型机将20..99替换为200099
- java - 在 Java 选项中连接流中的所有子集
- office-js - Office.context.mailbox.item 为空
- javascript - MaterializeCSS“materialboxed”类的砌体图像设计问题