×
广告

递减函数的应用

96
世外大帝
2018.11.02 11:58 字数 173

在正常遍历数组的情况下,删减自身元素导致的长度不足,影响循环次数不足

解决方案:
使用自身长度递减至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 ]

*/

原因分析:

  1. 数组的长度是5,毫无疑问,应该循环5次,
  2. 因为第一次删除了自身元素1, 所以倒是长度-1,跳过2的删除,
  3. 不需要删除,执行删除4后,遇到之前的问题,5不会被删除。

解决方案:

  1. 总长度不可变化
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 ]

*/
前端笔记
Web note ad 1