javascript - 如果初始值为数组,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
*/
为什么我会收到第三个错误?想知道它是如何工作的?
解决方案
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.
推荐阅读
- sql - 如何在查询中传递日期
- azure-cosmosdb - 调用 CreateDocumentAsync() 时,是否需要检查 ResourceResponse
错误? - java - Java - 如何从时间戳集合中删除重复项?
- blockchain - 无法注册“源”类型的给定路径,因为它超出了内容根目录。- CORDA 模板 JAVA
- python-3.x - python 3中字典合并期间键值的总和
- entity-framework - 如何根据另一个表中的字段订购 IQueryable?
- angular - 迎合具有空值的 Angular 表单
- vhdl - 2 的指数幂
- swift - 如何在没有滚动视图的情况下使用 textField 为键盘移动 imageView?
- c# - 如何在完成异步任务之前等待 24 小时?