有时候我们需要使用数组来管理一些数据,这里就会涉及到数组的添加、删除,今天想记录一下关于数组删除的一个坑
最开始我是这样删除数组的:
var arr = ['a', 'b', 'c', 'd'];
for (var i = 0; i < arr.length; i++) {
arr[i].toUpperCase(); // 这里还需要对数组做上某一个操作,我以转换大写字母来举例
arr.shift();
}
console.log(arr); // 这里的arr是 ['c', 'd']
最开始我的认知是,数组遍历循环,每次先对数组元素进行相应的操作,然后再弹出数组开头的元素,这样来删除数组中的所有元素。
js是一门动态语言,随着数组元素的弹出,这里的arr.length也在动态的改变着(这是坑一),这样造成的结果就是,数组循环两次过后,i 的值是2,而此时数组arr已经变为['c', 'd'],2<arr.length,所以循环就此结束,并没有达到想要删除循环中所有数据的目的。
改进后的代码如下:
var arr = ['a', 'b', 'c', 'd'];
var length = arr.length; // 先获取数组的长度,存储在一个变量中,防止数组长度动态的改变
for (var i = 0; i < length; i++) {
arr[i].toUpperCase(); // 这里还需要对数组做上某一个操作,我以转换大写字母来举例
arr.shift();
}
console.log(arr); // 这里的arr是 ['c', 'd']
这样确实解决了数组长度动态改变的bug,但在循环里边还需要先对数组元素做一个操作(这是坑二),再进行删除。因为js是动态的语言,所以在循环了两次之后,数组就变成了['c', 'd'],当 i 的值为2的时候,arr[i].toUpperCase() 这行代码就出现了错误,此时数组里边没有索引为2的元素了,代码报错。
我的解决方案是,先获取数组的长度,存储到一个变量中去,然后对数组进行倒序操作和删除
var arr = ['a', 'b', 'c', 'd'];
var i = arr.length - 1; // 先获取数组的长度,存储在一个变量中,防止数组长度动态的改变
for (; i >= 0; i--) {
arr[i].toUpperCase(); // 这里还需要对数组做上某一个操作,我以转换大写字母来举例
arr.pop();
}
这样我遇到的坑就填平了