Javascript 中使用 Array.reduce 的相同对象的总和

Posted

技术标签:

【中文标题】Javascript 中使用 Array.reduce 的相同对象的总和【英文标题】:Sum of same objects with Array.reduce in Javascript 【发布时间】:2022-01-09 18:20:06 【问题描述】:

我有一个这样的数组:

const inputArray = [
  
    userId: 1,
    sum: 30,
  ,
  
    userId: 1,
    sum: 20,
  ,
  
    userId: 2,
    sum: 50,
  ,
  
    userId: 2,
    sum: 80,
  ,
];

然后我写了一个函数,通过key对值求和,得到如下结果:

const output = [
  
    userId: 1,
    sum: 50,
  ,
  50,
  
    userId: 2,
    sum: 130,
  ,
  130,
];

如何纠正这个错误?功能代码如下:

const output = inputArray.reduce((accumulator, currentItem) => 
  const index = accumulator.findIndex((item) => item.userId === currentItem.userId);

  if (index < 0) 
    return [...accumulator, currentItem];
   else 
    return [...accumulator, (accumulator[index].sum += currentItem.sum)];
  
, []);

【问题讨论】:

预期结果是什么? @VLAZ 我想他只是想要增加 sum 属性的同一个数组 @Nick 我认为在问题本身中包含所有相关信息会很好。 这样写... 【参考方案1】:

试试

const inputArray = [
  
    userId: 1,
    sum: 30,
  ,
  
    userId: 1,
    sum: 20,
  ,
  
    userId: 2,
    sum: 50,
  ,
  
    userId: 2,
    sum: 80,
  ,
];

const output = inputArray.reduce((accumulator, currentItem) => 
  const matchedItem = accumulator.find((item) => item.userId === currentItem.userId);

  if (!matchedItem) 
    return [...accumulator, currentItem];
   else 
    matchedItem.sum += currentItem.sum
    return accumulator
  
, []);

console.log(output)

即使该项目已经存在,您仍将新项目附加到累加器,您只需要对其进行变异。此外,由于您处理的是对象数组,因此您可以使用find,因为它将返回对匹配对象本身的引用,让您直接更新对象,而不必使用findIndex 然后使用索引来查找它再次在数组中

【讨论】:

是的,它可以工作,但是这种方式会改变原始数组 那么改变数组有什么问题?【参考方案2】:

我建议,您可以简单地创建一个以 userId 为键和 sum 为值的对象,而不是 finding index,因为它可能会一次又一次地昂贵地迭代数组。

之后,你可以使用Object.entries(inputObj) 来制作对象数组。

var inputArray = [ userId: 1,sum: 30,userId: 1,sum: 20,userId: 2,sum: 50,userId: 2,sum: 80];

var outputObj = inputArray.reduce((finalObj, curObj) => 
  if (!finalObj[curObj.userId]) finalObj[curObj.userId] = curObj.sum  //<--- adding new user if do not exist in the object
  else finalObj[curObj.userId] += curObj.sum; // <---- if already present, the add the sum
  return finalObj;
, )

var output = Object.entries(outputObj).map((obj) => (
  userId: obj[0], //<--- key of object as userId
  sum: obj[1]  //<--- value of object as sum
));

console.log(output)

【讨论】:

【参考方案3】:

你可以试试这个:

const inputArray = [
  
    userId: 1,
    sum: 30,
  ,
  
    userId: 1,
    sum: 20,
  ,
  
    userId: 2,
    sum: 50,
  ,
  
    userId: 2,
    sum: 80,
  ,
];

const res = Array.from(inputArray.reduce((m, userId, sum) => m.set(userId, (m.get(userId) || 0) + sum), new Map), ([userId, sum]) => (userId, sum));

【讨论】:

以上是关于Javascript 中使用 Array.reduce 的相同对象的总和的主要内容,如果未能解决你的问题,请参考以下文章

javascript 使用JavaScript在脚本中插入脚本

JavaScript高级程序设计在HTML中使用JavaScript

javascript 在JavaScript中使用“this”的不同方式

JavaScript 在Javascript中使用“typeof”运算符

在 javascript 中使用 python 输出

在 PDF 文件中使用 JavaScript 代码的文档 [关闭]