首页 > 解决方案 > 如果初始值为数组,javascript中的reduce如何工作

问题描述

var a = [2,4,5,6,7]
a.reduce((acc,cur,i)=>acc,[])
//result : []
a.reduce((acc,cur,i)=>acc,[0,2])
//result (2) [0, 2]
a.reduce((acc,cur,i)=>acc[0],[0,2])
/*
VM410:1 Uncaught TypeError: Cannot read property '0' of undefined
    at <anonymous>:1:26
    at Array.reduce (<anonymous>)
    at <anonymous>:1:3
    */

为什么我会收到第三个错误?想知道它是如何工作的?

标签: javascriptarraysfunctional-programming

解决方案


reduce 函数用作 for 循环,在每次迭代时都会设置一个变量 (acc):

您给出的前两个示例:

var a = [2,4,5,6,7]

a.reduce((acc,cur,i) => acc, []) 
a.reduce((acc,cur,i) => acc, [0, 2])

相当于在每次迭代时将累加器分配给自身:

var acc = []; // [0, 2] in the second one

for(var i=0; i < a.length; i++){
    acc = acc;
}

而你的最后一个例子:

a.reduce((acc,cur,i) => acc[0], [0, 2])

相当于在每次迭代时将其第一个值赋给 acc :

var acc = [0, 2];

for(var i = 0; i < a.length; i++){
    acc = acc[0];
}

每次迭代都将分配给acc它的第一个值。第一次迭代将如下所示:

acc = [0, 2];
i = 0

acc = acc[0] // 0;

第二次迭代将如下所示:

acc = 0;
i = 1

acc = acc[0] // undefined;

现在acc被赋值为undefined ,因为acc持有的值中没有这样的属性0。因此,第三次迭代将如下所示:

acc = undefined;
i = 2;

acc = acc[0]; // Error, no property '0' of undefined.

推荐阅读