主要思路:
- 通过二重循环对比来判断(方式1~方式3)
- 通过indexOf()索引来判断,其实本质上也是数组的遍历(方式4)
- 通过filter的当前索引和实际索引是否一致来判断(方式5)
- 通过对象属性来判断(方式6),这种方式只用了一次循环,效率较高
- 通过es6的新特性来判断(Set 和…扩展属性) (方式7和方式8)
实现代码如下:
let arr = Array.from({length: 20}, _ => {
return Math.random()*10 | 0
})
console.log(arr)
// 方式1
for(let i=0;i<arr.length;i++){
for(let k=0;k<i;k++){
if(arr[i] === arr[k]){
arr.splice(i, 1);
i--;
}
}
}
console.log(arr)
// 方式2
for(let i=0;i<arr.length;i++){
for(let k=i+1;k<arr.length;k++){
if(arr[i] === arr[k]){
arr.splice(i, 1);
i--;
}
}
}
console.log(arr)
// 方式3
let rs3 = []
for(let i=0;i<arr.length;i++){
for(let k=i+1;k<arr.length;k++){
if(arr[i] === arr[k]){
i++;
k=i;
}
}
rs3.push(arr[i])
}
console.log(rs3)
//方式4 对结果集筛选
let rs4 = []
for(let i=0;i<arr.length;i++){
if(rs4.indexOf(arr[i]) === -1){
rs4.push(arr[i])
}
}
console.log(rs4)
//方式5
console.log(arr.filter((item, index) => {
return arr.indexOf(item) === index
}))
// 方式6 这种方式只需要一次循环,比较快
let tag = {}
let rs6 = []
for(let i=0;i<arr.length;i++){
if(!tag[arr[i]]){
rs6.push(arr[i])
tag[arr[i]]=true;
}
}
console.log(rs6)
// 方式7 es6的方法
let rs7 = new Set(arr)
console.log(Array.from(rs7))
//方式8
let rs8 = new Set(arr)
console.log([...rs8])