什么是数据坍塌:
当数组执行删除单元操作时,被删除单元之后的单元会前移,进而顶替被删除单元,出现在被删除单元的位置上,造成数组长度减少的情况,这样的现象称为数组的坍塌。
例如一栋五层高的大楼,当第二层楼被删除之后,五层楼变为了四层楼,原本的第三层楼也成为了变化后的第二层楼。
数组坍塌的实例
在数据去重时,我们经常会碰到数组坍塌的情况,例如:
<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]在进行一次比对,这样就不会有漏掉的情况了,执行结果如下: