先说说splice()方法的简单使用,它既可以对数组元素删除操作,也可以添加数组元素
数组名.splice(起时索引,删除元素个数,要添加的元素,要添加的元素,...)
先放上完整代码,下面再慢慢解释
// 定义一个数组
let arr = [1, -3, 0, 0, 1, 2, 3, 54, 54, 54, 54, 54, 54, 54, 54, 54, 1, 1, 1];
// 循环数组,以 i 为下标,从第一个元素开始,到倒数第二个元素
for (let i = 0; i < arr.length - 1; i++) {
// 循环数组,以 j 为下标,从 i 下标的下一个元素开始,到最后一个元素
for (let j = i + 1; j < arr.length ; j++) {
// 判断如果 i 和 j 下标对应的元素相等
if (arr[i] === arr[j]) {
// 删除数组中的 j 下标对应的元素
arr.splice(j, 1);
// 删除 j 下标后,j 对应的元素就变成了原来的 j+1 元素,所以需要 j--
j--;
}
}
}
// 打印数组
document.write(arr)
运行结果 :
思路:
外层循环从第一个元素开始,一直到倒数第二个元素为止;内层循环从外层循环所指向的元素的下一个元素开始,一直循环到数组的最后一个元素为止。在内层循环的过程中,如果发现当前元素与外层循环所指向的元素相等,则使用数组的splice方法将其删除,并将内层循环的指针j向前移动一位。最终,经过这个操作后,数组中重复的元素都被删除了,只保留了第一个出现的元素
问题一:为什么外层循环 i < arr.length - 1,里面的arr.length要减一?
因为是取数组第一个元素与后面的所有元素进行比较,数组最后一位元素已经被所有元素比较过了是不可能出现与最后一位元素重复的元素,所以需要减一,当然不减一也不出错,只是会循环一次无用的比较,为了减少无用循环和提高性能,还是建议动动你的小手,去除这无用的循环
问题二:为什么if里面有j-- ?
因为每次删除一个数组元素,被删数组元素的后一位元素 会占据原来被删元素的序列号,会导致遍历的时候跳过被删元素的后一位元素,所以每删一次元素,需要j减一