我无法完全理解Array.reduce
。
我有这个数组:
const fooArray = [1, 2, 3, 4, 5];
我要尝试的是将各个增量和推入新数组,例如:
[1, 3, 6, 10, 15]
这是我的reduce函数:
const barArray = [];
fooArray.reduce((previousValue, currentValue, currentIndex) => {
barArray.push(previousValue)
return previousValue + currentValue;
});
部分起作用,barArray
变成
[1, 3, 6, 10]
除了您会注意到fooArray
的长度为5而barArray
的长度为4之外,它缺少最终的总和,该总和应该为15。我知道previousValue + currentValue
会将所有总和起来,但是在增加所有增量和之后,我只是无法连接如何将其推入数组的末尾。
感谢您的帮助。
JSfiddle:http://jsfiddle.net/4u2fopyg/2/
答案 0 :(得分:4)
您可以计算累积总和,并将其推到barArray
之后在每一步都将其返回,同时确保将0
作为initialValue
传递到.reduce()
:< / p>
const fooArray = [1, 2, 3, 4, 5];
const barArray = [];
const total = fooArray.reduce((previousValue, currentValue) => {
const sum = previousValue + currentValue;
barArray.push(sum);
return sum;
}, 0);
console.log('barArray:', barArray.join(), 'total:', total);
或者,您可以传递连音号作为累加器,这可能是某些人的首选样式:
const fooArray = [1, 2, 3, 4, 5];
const [barArray, total] = fooArray.reduce(([barArray, previousValue], currentValue) => {
const sum = previousValue + currentValue;
barArray.push(sum);
return [barArray, sum];
}, [[], 0]);
console.log('barArray:', barArray.join(), 'total:', total);
答案 1 :(得分:2)
var fooArray = [1, 2, 3, 4, 5];
var result = fooArray.reduce(function(result,incr,index){ result.push((result[index-1] || 0) + incr); return result }, [] ); //increment by index[0] or index -1 and return result by adding last element value.
console.log(result);
答案 2 :(得分:0)
再多考虑一下……由于您想要一个与原始数组相同长度的数组,我觉得 map 操作可能更合适。
您可以使用Array.prototype.map
thisArg 跟踪运行总计
const fooArray = [1, 2, 3, 4, 5];
const barArray = fooArray.map(function(n) { // Note: not an arrow function
return this.last += n
}, {last: 0}) // the "this" arg
console.info(barArray)
此处的原始答案
一个选项是将reduce carry 数组参数初始化为第一个fooArray
元素,然后对其余元素执行reduce,并随即添加到最后一个元素值< / p>
例如
const fooArray = [1, 2, 3, 4, 5];
const barArray = fooArray.slice(1).reduce((previousValue, currentValue, index) => {
previousValue.push(previousValue[index] + currentValue)
return previousValue
}, [fooArray[0]]);
console.info(barArray)
这可确保在reducer回调中始终存在要添加的先前值集(即previousValue[index]
)。
请注意,.slice(1)
会创建原始数组的浅表副本(减去第一个元素),这可能会引起关注,也可能不会引起关注。