以双重循环为例解读数组塌陷问题?

<script>
        // 使用双层for循环,来完成对数组中数值的比较
        // 如果数值相同,就删除其中一个数值

        // 从第一个数值开始循环,第一个数值和其后的所有数据进行比较
        // 如果要是数值相同,就删除之后的数值
        // 循环次数比较多

        var arr123 = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
        
        function setNewArr2(arr){
            // 外层循环,从第一个数值开始,循环至最后一个数值
            for(var i = 0 ; i <= arr.length-1 ; i++){
                // 内层循环,从当前起始数值的下一个数值开始,循环至最后一个数值
                for(var j = i+1 ; j <= arr.length-1 ; j++){
                    if(arr[i] === arr[j]){
                        // 执行删除数组单元操作,之后的单元,会前移,顶替当前位置的单元
                        // 此时,当前位置就是放置了一个新的单元
                        // 这个位置就必须要重新操作一次,判断数值是否相同
                        arr.splice(j,1);
                        // 先将循环生成的索引--, 在执行循环的++
                        // 等于操作之后,索引值没有变,下次循环,执行的对象,仍然是当前这个单元
                        j--;
                    }
                }
            }         

            return arr;
        }

        var newArr = setNewArr2(arr123);

        console.log(newArr);

        // 总结:
        // 循环操作数组,只要执行了删除数组单元的操作
        // 一定要将循环变量数值 执行 -- 操作

  如果后一项 arr[j] 等于了前一项  arr[i] ,那么利用数组的删除方法 splice()删除数组下标对应的值,此时如果不用 j-- 控制数组 arr[j] 的索引,就会对跳过当前删除的数值的后一位数的判断,从而导致漏删(因为当你删除数组中的某一项,后一项数值会向前一项坍塌,导致后一项数值的索引与前面被删除一项的索引一致)

猜你喜欢

转载自www.cnblogs.com/htmllym/p/12640815.html