当数组在执行删除单元操作时被删除单元之后的单元会向前进一位进而顶替被删除的单元,会造成数组的长度减少的情况这种现行叫做数组塌陷。当我们在利用数组的索引下标进行一些操作时要特别注意这个问题。
例如:去除数组中重复的元素
// 先将数组中的数值,按照大小顺序,排列
// 排序之后,相同的数值,一定是相邻的
// 此时,只要相邻的两个数值比较,如果相同,删除后一个数据,再执行 i--
// 使用一层循环就可以了
// 循环次数就比较少
var arr = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
var newArr = setNewArr3(arr);
console.log(newArr);
function setNewArr3(arr){
// 先对数组进行排序操作,相同数据,相邻
var newArr = arr.sort(function(a,b){return a-b});
console.log(newArr);
// 当前数据与下一个数据比较
// 冒泡排序的优化原理:只要循环到倒数第二个单元
// 就会通过i+1 与最后一个单元比较
// 比较到最后一个单元,循环只要执行到,倒数第二个单元
for(var i = 0 ; i <= newArr.length-1 -1 ; i++){
if(newArr[i] === newArr[i+1]){
// 删除后一个单元
newArr.splice(i+1 , 1);
// 防止数组坍塌,造成有单元没有执行操作
i--;
}
}
return newArr;
}
在for循环中因为使用删除操作当删除前一个元素,后一个元素会向前顶替那么在正常的循环里就会有元素不会被循环到,产生问题,加上一个if判断完美解决塌陷问题。