JavaScript对象数组中子集合属性求和实现咨询
计算所有transactions的amount总和的几种方法
嘿,你已经搞定了value总和的计算,做得很棒!关于所有transactions里的amount总和,其实有几种简洁的实现方式,不一定非要用复杂的嵌套循环(当然嵌套循环也能行,但我们可以写得更优雅一点),下面给你拆解几种方案:
方案一:嵌套Reduce(最直接的思路)
这其实就是你一开始想到的“对每个对象执行reduce”的思路,但可以写成非常简洁的链式代码:
const totalAmount = objects.reduce((acc, obj) => { // 累加当前对象下所有transactions的amount return acc + obj.transactions.reduce((txSum, transaction) => txSum + transaction.amount, 0); }, 0);
外层的reduce遍历每个对象,内层的reduce专门处理当前对象的transactions数组,把里面的amount加起来后,再累加到全局的累加器acc里。逻辑清晰,完全符合你的初始想法,非常好理解。
方案二:先扁平化再Reduce(更流畅的链式调用)
如果你喜欢链式写法,可以先把所有transactions数组合并成一个一维数组,再统一计算总和:
const totalAmount = objects .map(obj => obj.transactions) // 提取所有对象的transactions,得到二维数组 .flat() // 把二维数组扁平化,变成所有transaction对象的一维数组 .reduce((acc, transaction) => acc + transaction.amount, 0);
这种方式把“提取-合并-计算”的步骤拆解开,代码读起来很流畅,适合习惯函数式编程风格的场景。
方案三:Reduce + forEach(更直观的遍历)
如果你觉得嵌套reduce有点绕,也可以用forEach代替内层的reduce,写法更直观:
const totalAmount = objects.reduce((acc, obj) => { obj.transactions.forEach(transaction => { acc += transaction.amount; }); return acc; }, 0);
外层用reduce维护全局总和,内层用forEach遍历每个transaction直接累加,逻辑一目了然,新手也能快速看懂。
这几种方法都能完美实现你的需求,选你觉得最顺手、最符合团队代码风格的就行~
内容的提问来源于stack exchange,提问作者dascorp
相关产品推荐
相关产品推荐

