// 删除小于5的元素
let arr = [1,2,3,4,5,6,7]
for (let i = 0, leng = arr.length; i < leng; i++) {
if (arr[i] < 5) {
arr.splice(i, 1);
}
}
console.log(arr); // [2,4,5,6,7]
- 看的出来,最终不是我们想要的结果
- 分析原因: 删除操作会使得对应索引值位上的元素清空,整个数组中的元素向前移动一位,补位的元素会填充到执行删除操作的索引值位置上,移位之后如果不进行任何操作继续下一个循环,会导致补位元素跳过遍历,为了防止这种补位元素跳过遍历现象,有两种方法:
- 1. 应该在删除操作后将索引值减1,对执行删除操作的索引值位置再进行一次遍历
- 2. 循环中索引添加递加判断,只有在不删除元素时才对索引递加
- 改进
for (let i = 0, leng = arr.length; i < leng; i++) {
if (arr[i] < 5) {
arr.splice(i, 1);
i--; // 删除操作后将索引值减1,对执行删除操作的索引值位置再进行一次遍历
}
}
console.log(arr); // [5, ,6, 7]
for (let i = 0, leng = arr.length; i < leng;) {
if (arr[i] < 5) {
arr.splice(i, 1);
}else {
i++; 添加递加判断,只有在不删除元素时才对索引递加
}
}
console.log(arr); // [5, ,6, 7]
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] < 5) {
arr.splice(i, 1);
}
}
console.log(arr); // [5, ,6, 7]
- 还有另外一种思路是循环将不需要删除的元素推入到新的数组中,也能达到假性删除特定元素的目的。
- 可用filter方法来实现
arr = arr.filter(item => item >= 5)
console.log(arr); // [5, ,6, 7]
|