在javascript中创建一个累积总和数组

IT技术 javascript arrays
2021-01-23 11:14:01

这是我需要做的一个例子:

var myarray = [5, 10, 3, 2];

var result1 = myarray[0];
var result2 = myarray[1] + myarray[0];
var result3 = myarray[2] + myarray[1] + myarray[0];
var result4 = myarray[3] + myarray[2] + myarray[1] + myarray[0];

所以所有这些都会输出 5, 15, 18, 20

但不是像那样写出所有的变量,我希望它说:

var result = arrayitem + the sum of any previous items 

那有意义吗?那可能吗?我怎么做?

6个回答

Nina Scholz复制的优雅解决方案,使用柯里化来访问以前的值。

const cumulativeSum = (sum => value => sum += value)(0);

console.log([5, 10, 3, 2].map(cumulativeSum));

cumulativeSum是函数value => sum += valuesum初始化为零。每次被调用时,sum都会更新并在下次调用时(输入 [n])等于前一个值(输出 [n-1])。

或者定义cumulativeSumconst cumulativeSum = (sum => value => sum += value);然后调用它array.map(cumulativeSum(0));
2021-03-16 11:14:01
我仍然对它的工作方式感到困惑cumulativeSum如何map知道更新sum每次迭代?sum甚至如何在被分配参数(0)时幸存下来?(Fwiw,它仍然可以在没有参数代替 0 的情况下工作。)这个箭头函数是黑魔法吗?
2021-03-19 11:14:01
@olefrank 从一开始, sum 为 0。cumulativeSum 用 5 调用,因此sum += 5将 5 添加到sum并返回sum然后它用 10 调用,所以sum变成 15。然后是 3、18 和 2、20。
2021-03-22 11:14:01
很好很简短,但你必须知道你只能运行它一次,因为它会保留它的sum值,下次你调用cumulativeSum它时会保留它的旧值。因此,如果您cumulativeSum在某个本地范围内并且仅在其中使用一次,则只能重复工作......
2021-04-01 11:14:01
@ElmarZander 是的,最好只内联代码而不是声明一个函数以确保它不会被重用。
2021-04-05 11:14:01

Javascriptreduce提供当前索引,这在这里很有用:

var myarray = [5, 10, 3, 2];
var new_array = [];
myarray.reduce(function(a,b,i) { return new_array[i] = a+b; },0);
new_array // [5, 15, 18, 20]
这有效,但我认为这是一种非常笨拙且令人困惑的使用reduce.
2021-03-18 11:14:01

reduce避免创建新数组的替代方法:

var result = myarray.reduce(function(r, a) {
  r.push((r.length && r[r.length - 1] || 0) + a);
  return r;
}, []);

无需为每个结果重新对子数组求和。

编辑同一事物的不那么丑陋的版本:

var result = myarray.reduce(function(r, a) {
  if (r.length > 0)
    a += r[r.length - 1];
  r.push(a);
  return r;
}, []);
简单地说r[r.length - 1] || 0,不需要ifs。
2021-03-20 11:14:01
@raina77ow 是的,我只是添加了一个不那么愚蠢的相同想法的版本:)
2021-04-01 11:14:01
@thg435 是的,这也可以,这可能是我在实际代码中编写的内容,但这if使它更容易理解。
2021-04-13 11:14:01

ES6 数组扩展的更多选项

[1, 2, 3].reduce((a, x, i) => [...a, x + (a[i-1] || 0)], []); //[1, 3, 6]

或者

[3, 2, 1].reduce((a, x, i) => [...a, a.length > 0 ? x + a[i-1] : x], []); //[3, 5, 6]

使用 ES6 的简单解决方案

let myarray = [5, 10, 3, 2];
    let new_array = [];  
    myarray.reduce( (prev, curr,i) =>  new_array[i] = prev + curr , 0 )
    console.log(new_array);

有关更多信息Array.reduce()

箭头函数

您可能想详细说明该代码将如何以及为何在此处解决问题的答案。
2021-03-17 11:14:01