gpt4 book ai didi

javascript - 使用 reduce 的数组输出的特定键的累积和

转载 作者:行者123 更新时间:2023-12-05 09:29:51 25 4
gpt4 key购买 nike

假设我有以下数组:

let arr = [{a: 1, b: 2}, {a: 2, b: 4}, {a: 8, b: -1}]

我想计算每个键的累积和,但我也希望输出是一个长度与每一步的累积值相同的数组。最终结果应该是:

[{a: 1, b: 2}, {a: 3, b: 6}, {a: 11, b: 5}]

我的问题是我无法获得所需的数组。我只得到最终的对象:

let result = arr.reduce((accumulator, element) => {
if(accumulator.length === 0) {
accumulator = element
} else {
for(let i in element){
accumulator[i] = accumulator[i] + element[i]
}
}
return accumulator
}, [])

console.log(result); // {a: 11, b: 5}

最佳答案

您所追求的听起来像是 scan() 高阶函数(借鉴了 ramda.js 的想法),它允许您返回数组中每个元素的累积结果。 scan 方法类似于 .reduce() 方法的行为方式,不同之处在于它返回每个元素的累加器。您可以像这样自己构建 scan() 函数:

let arr = [{a: 1, b: 2}, {a: 2, b: 4}, {a: 8, b: -1}];

const scan = ([x, ...xs], fn) => xs.reduce((acc, elem) => {
return [...acc, fn(acc.at(-1), elem)];
}, xs.length ? [x] : []);

const res = scan(arr, (x, y) => ({a: x.a+y.a, b: x.b+y.b}));
console.log(res);

您可能会考虑进一步改进,例如为扫描方法提供初始值(类似于 reduce 接受一个值的方式)。此外,如果您需要更好的浏览器支持 .at()方法目前只有有限的浏览器支持,因此您可以考虑创建自己的 at() 函数:

const at = (arr, idx) => idx >= 0 ? arr[idx] : arr[arr.length + idx];

关于javascript - 使用 reduce 的数组输出的特定键的累积和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70255206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com