如何在累加器中使用数组映射?
让我们有一个数字列表,并找到一个当前和的列表。
例:
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);