[英]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.