映射和拼接给出空而不是空

时间:2018-06-28 08:44:07

标签: javascript

我有一个算法:

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次。

我知道可以达到预期的结果,过滤器效果更好。我只是想知道,这是怎么回事?

1 个答案:

答案 0 :(得分:3)

请参见MDN documentation

  

map依次为数组中的每个元素调用提供的回调函数,然后从结果中构造一个新的数组。仅对具有已分配值(包括未定义)的数组索引进行调用。不会因为缺少数组元素(即从未设置,已删除或从未分配值的索引)而调用它。

     

如果更改了数组的现有元素,则传递给callback的值将是映射访问它们时的值。在地图调用开始之后和被访问之前被删除的元素不会被访问。

您正在遍历数组时对其进行变异,这意味着一旦到达索引[4],该元素(其值以前为5)就不再存在,这意味着该函数不存在在该迭代中被调用,结果为<empty>。创建的数组包含5个元素,但永远不会在最后一个元素上调用回调。

改为使用filter