数据坍塌

185 阅读2分钟

什么是数据坍塌:

当数组执行删除单元操作时,被删除单元之后的单元会前移,进而顶替被删除单元,出现在被删除单元的位置上,造成数组长度减少的情况,这样的现象称为数组的坍塌。

例如一栋五层高的大楼,当第二层楼被删除之后,五层楼变为了四层楼,原本的第三层楼也成为了变化后的第二层楼。

数组坍塌的实例

在数据去重时,我们经常会碰到数组坍塌的情况,例如:

   <script>
        var arr1 = [1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4];
        var newArr = setNewArr2(arr1);
        console.log(newArr);
        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);
                    }
                }
            }
            return arr;
        }
    </script>

这段代码的实现是想要将数组arr1中的数据单元进行去重。首先从索引下标i=0的数据单元开始向后循环进行比较,如果arr[i]和arr[j]全等的话,就会执行删除操作。执行结果如下:

从执行结果图中可以看到,并没有实现完全去重的效果。此时就是因为发生了数组坍塌所造成的。
当从索引下标i = 0的数据单元也就是第一个1开始向后循环的时候,arr[i]===arr[j]的条件成立了,所以开始执行删除操作,删除从索引下标j = 1开始的第一个数,也就是第二个1。此时,产生了数组坍塌的效果。
索引下标为2的数据单元,也就是第三个1,成为了索引下标为1的数据单元。再继续进行j ++的循环的时候,索引下标i = 0的数据单元和索引下标j = 2的数据单元进行比对,但是此时索引下标j = 2的数据单元是刚开始索引下标为3的数据单元,因为产生了数据坍塌,所以索引下标成为了2。但此时索引下标为2的数据单元就被漏掉了,没有和arr[i]进行比较,所以产生了这样的结果。

解决数组坍塌的办法

此时,我们对代码进行一个修改:

 <script>
        var arr1 = [1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4];
        var newArr = setNewArr2(arr1);
        console.log(newArr);
        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;
        }
    </script>

我们在删除操作之后添加了j -- 的操作,这样在删除操作之后,就可以让arr[i]和arr[j]在进行一次比对,这样就不会有漏掉的情况了,执行结果如下: