Javascript减少推送总和+最终总和

时间:2018-06-20 03:48:23

标签: javascript arrays

我无法完全理解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/

3 个答案:

答案 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)会创建原始数组的浅表副本(减去第一个元素),这可能会引起关注,也可能不会引起关注。