如何实现数组去重?
方案一 通过indexof
let arr = [1, 3, 5, 7, 7, 1, 66]
let Arr = []
arr.forEach(item => {
if (Arr.indexOf(item) === -1) {
Arr.push(item)
}
})
console.log(Arr); //打印结果 [1, 3, 5, 7, 66]
方案二 通过双重for循环
执行过程
双层for循环的执行过程
第一次外层 arr[i]==>88
内层执行 arr[j]==>3
内层执行 arr[j]==>5
内层执行 arr[j]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第二次外层 arr[i]==>3
内层执行 arr[j]==>5
内层执行 arr[j]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第三次外层 arr[i]==>5
内层执行 arr[j]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第四次外层 arr[i]==>7
内层执行 arr[j]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第五次外层 arr[i]==>7
内层执行 arr[j]==>3
内层执行 arr[j]==>66
————————————————————————
第六次外层 arr[i]==>3
内层执行 arr[j]==>66
————————————————————————
第七次外层 arr[i]==>66
内层执行:外层的最后一次i起始值为数组下标6,是数组的最后一个元素,内层j的起始值为6+1就是数组的下标为7的元素。 也就是说当前内层循环的j是7 而arr.length(数组长度)为6,那么7 < 6 吗? 所以条件不成立,最后一次内循环不执行,直接退出了循环。
————————————————————————
let arr = [88, 3, 5, 7, 7, 3, 66]
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
for (let j = i + 1; j < arr.length; j++) {
console.log(arr[j]);
// 判断条件 把重复的数删除
if (arr[i] === arr[j]) {
arr.splice(j, 1)
}
}
}
方案三 利用Set()+Array.from()
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。Set 中的元素只会出现一次,即 Set 中的元素是唯一的。
Array.from() 方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
// 封装直接调用
function unique(arr) {
return Array.from(new Set(arr))
}
let arr = [88, 3, 5, 7, 7, 3, 66]
let setMy = new Set()
arr.forEach(item => setMy.add(item))
console.log(setMy); Set(5); //打印结果 { 88, 3, 5, 7, 66 }
console.log(Array.from(setMy)); //打印结果 [88, 3, 5, 7, 66]
方案四 利用数组的includes方法
includes()方法:用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false。
let arr = [88, 3, 5, 7, 7, 3, 66]
const Arr = []
arr.forEach(item => {
// 判断
console.log(!Arr.includes(item));
if (!Arr.includes(item)) {
Arr.push(item)
}
})
console.log(Arr); //打印结果:[88, 3, 5, 7, 66]
方案五 利用 filter和indexOf
let arr = [88, 3, 5, 7, 7, 3, 66]
let Arr = arr.filter(function (item, index, arr) {
console.log(index); //打印结果 0 1 2 3 4 5 6
console.log(arr.indexOf(item, 0)); //打印结果 0 1 2 3 3 1 6
return arr.indexOf(item, 0) === index
})
console.log(Arr); //打印结果:[88, 3, 5, 7, 66]
总结:
这里分享了5种方案
- 方案一 通过indexof
- 方案二 通过双重for循环
- 方案三 利用Set()+Array.from()
- 方案四 利用数组的includes方法
- 方案五 利用 filter和indexOf
更推荐大家使用的是方案一和方案二,也是比较常用的哦