我有一个算法:
let someArray = [1, 2, 3, 4, 5]
let mapped = someArray.map(number => {
let index = someArray.indexOf(5)
if (index !== -1) {
someArray.splice(index, 1)
}
console.log(typeof number)
return number
})
console.log(mapped)
console.log(mapped.length)
console.log(Object.keys(mapped).length)
所以我期望的是mapped=[1,2,3,4]
和mapped.length=4
但是我有mapped=[1,2,3,4,empty]
和mapped.length=5
。
所以我的想法是:一开始,map将进行5次迭代,所以无论如何它都会这样做。这就是为什么我添加console.log(typeof number)
。
但是它只执行了4次。
我知道可以达到预期的结果,过滤器效果更好。我只是想知道,这是怎么回事?
答案 0 :(得分:3)
map依次为数组中的每个元素调用提供的回调函数,然后从结果中构造一个新的数组。仅对具有已分配值(包括未定义)的数组索引进行调用。不会因为缺少数组元素(即从未设置,已删除或从未分配值的索引)而调用它。
如果更改了数组的现有元素,则传递给callback的值将是映射访问它们时的值。在地图调用开始之后和被访问之前被删除的元素不会被访问。
您正在遍历数组时对其进行变异,这意味着一旦到达索引[4],该元素(其值以前为5)就不再存在,这意味着该函数不存在在该迭代中被调用,结果为<empty>
。创建的数组包含5个元素,但永远不会在最后一个元素上调用回调。
改为使用filter
。