繁体   English   中英

如果初始值为数组,javascript 中的 reduce 如何工作

[英]How reduce in javascript work if initial value is array

 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 */

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

reduce function 用作 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.

您的代码不返回数组。 但是,累加器将设置为该值。 因此,当您假设acc是一个数组时,它不是在第一次调用累积 function 之后。

您可以做的是以下几行:

 var a = [2,4,5,6,7]; a.reduce((acc,cur,i) => { acc.push(cur); console.log(`iter ${i}, acc = ${JSON.stringify(acc)}.`); return acc; },[0,2] );

只需确保您的回调在每次调用时都返回一个数组。

Array.reduce 的 mdn 文档节选

initialValue - 用作回调第一次调用的第一个参数的值。 如果未提供初始值,则数组中的第一个元素将用作初始累加器值并作为 currentValue 跳过。 在没有初始值的空数组上调用 reduce() 将引发 TypeError。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM