在正常遍历数组的情况下,删减自身元素导致的长度不足,影响循环次数不足
解决方案:
使用自身长度递减至0,不会影响循环次数
注意点:i<-1,因为需要递减至0号位置
例子:
// 遍历原数组,不包含新数组的元素将被删除
var arr = [1, 2, 3, 4, 5];//原数组
var newArr = [3];// 新元素数组
for (var j = 0; j < newArr.length; j++) {
for (var i = 0; i < arr.length; i++) {
if (newArr[j] != arr[i]) {
arr.splice(i, 1);
console.log("删除过程:",arr)
}
}
}
// 应该删除[1,2,4,5],保留元素应为[3]
console.log("final:",arr);
/*
result:
删除过程: [ 2, 3, 4, 5 ]
删除过程: [ 2, 3, 5 ]
final: [ 2, 3, 5 ]
*/
原因分析:
- 数组的长度是5,毫无疑问,应该循环5次,
- 因为第一次删除了自身元素1, 所以倒是长度-1,跳过2的删除,
- 不需要删除,执行删除4后,遇到之前的问题,5不会被删除。
解决方案:
- 总长度不可变化
var arr = [1, 2, 3, 4, 5];//原数组
var newArr = [3];// 新元素数组
for (var j = 0; j < newArr.length; j++) {
for (var i = arr.length; i >-1; i--) {
if (newArr[j] != arr[i]) {
arr.splice(i, 1);
console.log("删除过程:",arr)
}
}
}
// 应该删除【1,2,4,5],保留元素应为[3]
console.log("final:",arr);
/*
result:
删除过程: [ 1, 2, 3, 4, 5 ]
删除过程: [ 1, 2, 3, 4 ]
删除过程: [ 1, 2, 3 ]
删除过程: [ 1, 3 ]
删除过程: [ 3 ]
final: [ 3 ]
*/
网友评论