首页 > 解决方案 > 按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 函数来简短回答。

标签: 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,你查找那个原始项目,并将新数量添加到以前的数量。


推荐阅读