概念
数组塌陷:在对数组进行操作的时候,会使数组的长度产生变化,同时,操作的数组那个项的下一个索引会被跳过,从而造成数组的某项会被跳过,这种叫做数组塌陷现象。
例子:
let arr = [1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9]
for (let i = 0; i < arr.length; i++) {
// 判断
if (arr[i] === 3) {
arr.splice(i, 1); // 此时, 删除的那一项会与原数组下标产生差异, 后面的所有成员都会往前移动。
}
}
console.log(arr)
运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ba3a679859864c8d862bb96e0830f5a6.png)
我们原本的目的是循环判断数组中的每一项的值,如果等于3就删除,实际上却发现没有删除干净,原因就是数组塌陷。
具体过程:
遍历到第一个3,索引值 i 是2,执行删除操作,此时数组的长度就从原来的 15 变成了14,索引值还是 2;
再进行循环 i++
,这时 i 变成 3,原来数组中的第二个 3 本来的索引值是 3 ,现在索引值变成了 2,这样再去执行 i = 3
的操作,这样就跳过了原来没删除数组中的第二个3,去执行后面的操作,从而造成了输出的结果会有 3 没有被删除感觉,就形成了数组塌陷现象。
解决办法:
i–
就是在对数组某项进行操作之后,手动将索引值 i --,保持数组每一项都被遍历。
let arr = [1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9]
for (let i = 0; i < arr.length; i++) {
// 判断
if (arr[i] === 3) {
arr.splice(i, 1); // 此时, 删除的那一项会与原数组下标产生差异, 后面的所有成员都会往前移动。
i--; // 有了这条代码 才可以保证与数组中的每一个成员的下标一一对应。
}
}
console.log(arr)
运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/b53e27695ba1457594defcfecf3a954d.png)
数组倒着遍历
let arr = [1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9]
for (let i = arr.length - 1; i >= 0; i--) {
// 判断
if (arr[i] === 3) {
arr.splice(i, 1);
}
}
console.log(arr)
运行结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f18d9e6806f542868a993de73536313a.png)