为什么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,但据我所知,在这种情况下它不应该是空的。

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

您在迭代数组时从数组中删除元素。文档中写道:

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

因此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]));

问题是,您pop某些元素,因此,它们不再存在于数组中。所以,前两个元素是poped,另外两个元素写在这些地方,但在内部,它们同时也不存在了。

还有许多其他(更好的(解决方案,比如这个(从这里开始(:

function reverse (array) {
var i = 0,
n = array.length,
middle = Math.floor(n / 2),
temp = null;
for (; i < middle; i += 1) {
temp = array[i];
array[i] = array[n - 1 - i];
array[n - 1 - i] = temp;
}
}

最新更新