如何在累加器中使用数组映射?

让我们有一个数字列表,并找到一个当前和的列表。
例:

const nums = [1, 1, 1, -1, -1];
const sums = [1, 2, 3,  2,  1];

我尝试通过使用map中的累加器来使用thisArg来做到这一点,因为根据:MDN Array.prototype.map()



我提供了一个acc设置为0的对象作为thisArg:
const actual = nums.map(val => this.acc += val, {acc: 0});

require('assert').deepEqual(actual, sums);

它因错误而崩溃:
AssertionError: [ 1, 2, 3, 2, 1 ] deepEqual [ NaN, NaN, NaN, NaN, NaN ]

该测试通过一个外部累加器通过:
let   acc    = 0;
const actual = nums.map(val => acc += val);

最佳答案

通过使用arrow functions,您可以在函数中释放 this ,该函数已经从外部空间进行了设置。

您可以使用function statement thisArg

const nums = [1, 1, 1, -1, -1];
const actual = nums.map(function (val) { return this.acc += val; }, { acc: 0 });

console.log(actual);


为了保持箭头功能,您可以在累加器上使用closure
(acc => val => acc += val)(0)  // complete closure with callback

它分两步工作,首先,它使用acc的值直接调用该函数
(acc =>                  )(0)  // function for generating a closure over acc

并返回内部函数作为 Array#map 的回调
        val => acc += val      // final callback

使用acc的闭包,这意味着acc的范围在自己的函数内部以及返回的回调内部。

const nums = [1, 1, 1, -1, -1];
const actual = nums.map((acc => val => acc += val)(0));

console.log(actual);

10-06 15:31