首页 > 解决方案 > 为什么 pop() 方法在 map 方法中使用时停止工作?

问题描述

我想在不使用 reverse 方法的情况下将数组反转到位。我尝试了以下代码:

function reverseArray(arr) {
  return arr.map(() => {
    return arr.pop()
  })
}
console.log(reverseArray([1, 2, 3, 4]));
//logs [4,3,undefined,undefined]

使用开发工具调试器,这是控制台中的日志:(4) [4, 3, empty × 2].

arr.pop()如果在空数组上调用,则返回 undefined,但据我了解,在这种情况下它不应该为空。

问题:发生了什么?为什么前两个元素打印正确,而其余的则不正确?

标签: javascriptarraysdictionary

解决方案


在迭代数组时,您正在从数组中删除元素。文档说:

map 处理的元素范围是在第一次调用回调之前设置的。...在调用 map 开始之后和被访问之前被删除的元素不会被访问。

所以map()一开始就确定它会迭代 4 次,创建一个有 4 个元素的数组。

在第一次迭代中,arr.pop()删除arr[3]. 在第二次迭代中,它删除了arr[2].

第三次迭代预计处理arr[2]. 但是由于该元素不再存在,它不会调用回调函数,而只是存储undefined在结果数组中。同样的事情发生在第四次迭代。

您可以遍历数组的副本。

function reverseArray(arr) {
  return [...arr].map(() => {
    return arr.pop()
  })
}
console.log(reverseArray([1, 2, 3, 4]));


推荐阅读