数组塌陷

610 阅读2分钟

什么是数组塌陷

数组塌陷就是,一个数组在进行删除数据单元操作的时候,删除掉这个单元之后,后面的数据单元会自动的补充的这个位置上来,造成数组长度的减少,这种情况被称之为数组塌陷

这样来看数组塌陷是没有任何影响的,但是当我们对数组进行循环遍历操作时,会产生影响,比如说对数组进行去重

 var arr1 = [1,1,1,3,2,2,3,3];
     arr1.sort();
         for(var j=0;j<arr1.length-1;j++){
             if(arr1[j] === arr1[j+1]){
             arr1.splice(j+1,1);
             }
         }
     console.log(arr1);

这段代码是我们在使用 数组名称.sort(); 先对数组进行排序然后使用 数组名称.splice(); 删除重复的数据单元 搭配起来对数组进行去重

由结果可以看出,以上代码对数组去重会出现由数组坍塌来带的影响

根据这张图我们可以看出,再对数据单元进行比较时,我们删除掉与第一个重复的数据单元,但是但我们删除掉这个单元之后,由于数组存在数组塌陷,所以第三个数据单元会自动移动到第二个数据单元的位置,此时,第一轮循环结束,此时进行第二轮循环,在进行第二轮循环的时候,j进行加一,由于j与j+1并不相等,所以会进行下一轮循环,因此这个原本处于第三位的1会跳过与第一个的进行比较的过程,这就是数组塌陷带来的影响 (数据单元:数组中的每一个独立单位)

为了解决这个问题,我们可以在判断后对j进行-1

    var arr1 = [1,1,1,3,2,2,3,3];
        arr1.sort();
            for(var j=0;j<arr1.length-1;j++){
                if(arr1[j] == arr1[j+1]){
                arr1.splice(j+1,1);
                j--;
                }
            }
        console.log(arr1);

此时我们再来看,最终的结果,

所以再对数组进行去重的时候,或者是对数组进行循环遍历并删除数据单元的时候,一定要注意数组塌陷带来的影响

上边只提供了一种 -- 的方案,还有一种解决方案,就是从后向前便利数组

    var arr1 = [1,1,1,3,2,2,3,3];
        arr1.sort();
            for(var j=arr1.length-1;j>0;j--){
                if(arr1[j] == arr1[j-1]){
                arr1.splice(j-1,1);
                }
            }
        console.log(arr1);

这样也可以解决这个问题,实际应用中,看情况而定

由于刚入行,以上内容并不详细,在我学习更加深入之后会再进行补充,谢谢观看。