在正常遍历数组的情况下,删减自身元素导致的长度不足,影响循环次数不足
解决方案:
使用自身长度递减至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 ] */
作者:世外大帝
链接:https://www.jianshu.com/p/7a2e744329ec