无需登录 数据私有 本地保存

数组方法可视化 - map/filter/reduce

11
0
0
0

数组方法可视化

直观理解 map / filter / reduce 的执行过程

逐步执行 过程可见
[ ]
1,2,3,4,5 10,20,30,40,50 apple,banana,cherry 3,7,2,9,1,8
el =>
el * 2 el * el el + 10 el.toUpperCase() Item模板
点击下方 "下一步" 开始执行,观察每个元素如何被处理 步骤 0 / 0
原始数组:
结果: 等待执行...
速度:
执行日志
准备就绪,点击"下一步"开始...
常见问题与知识点

map() 返回一个新数组,包含对原数组每个元素执行回调后的结果,不修改原数组。常用于数据转换。
forEach() 仅遍历数组执行回调,返回 undefined,无法链式调用。通常用于执行副作用操作(如打印日志、DOM操作)。
[1,2,3].map(x => x*2) 返回 [2,4,6],而 [1,2,3].forEach(x => x*2) 返回 undefined

不一定。如果所有元素都满足条件,filter 返回的数组长度等于原数组长度(但是一个新数组,浅拷贝)。如果没有元素满足条件,则返回空数组 []
例如:[1,2,3].filter(x => x > 0) 返回 [1,2,3](长度相同但不同引用)。

初始值作为第一次回调的累加器参数。如果不提供初始值,reduce 会将数组第一个元素作为初始累加器,并从第二个元素开始遍历。
建议始终提供初始值,以避免空数组报错 TypeError: Reduce of empty array with no initial value 以及类型不一致问题。

reduce 是通用方法,可以模拟 map 和 filter:
模拟 map:arr.reduce((acc, el) => { acc.push(el*2); return acc; }, [])
模拟 filter:arr.reduce((acc, el) => { if(el>2) acc.push(el); return acc; }, [])
这体现了 reduce 的强大灵活性。

map/filter/reduce 的回调函数都接收 3个参数
map/filter:(element, index, array) — 当前元素、索引、原数组
reduce:(accumulator, currentValue, index, array) — 累加器、当前元素、索引、原数组
本工具中,您可以使用 el 代表元素,i 代表索引。