1.ES6方法 new Set
const s = new Set();
let arr = [1,2,3,4,3,2,1];
arr.forEach(items=>s.add(items));
console.log(s)//set(4){1,2,3,4}
for(let i of s){
console.log(i);//1 2 3 4
}
//或者
let arr1 = [...new set(arr)];
console.log(arr1)//1 2 3 4
2、indexOf 去重
const arr = [1,2,3,4,5,5,4,3,2,1];
const arr1 = [];
for(var i = 0;i<arr.length;i++){
/*
indexOf()用于检测arr1(自身)是否含有对应的字符串
如果有则返回字符串首次出现的位置,没有则返回-1
*/
if(arr1.indexOf(arr[i])===-1){
arr1.push(arr[i])
}
}
console.log(arr1);
3、filter() 去重
const arr = [1, 2, 2, 3, 4,4, 5, 5, 6, 7, 7];
let newArr = arr.filter((items,index,arr)=> arr.indexOf(items,0) === index) // 只保留满足条件的值
console.log(newArr);//[1, 2, 3, 4, 5, 6 ,7]
filter的第三参数self代表函数本身,而indexOf始终返回第一次找到匹配该元素的索引。
过程如下:
第一次循环,传入元素1,index(1)的索引为0,而此时1的索引本来就是0,满足。
第二次循环,传入元素2,index(2)的索引为1,而此时2的索引也是1,也满足。
第三次循环,传入元素2,index(2)的索引为1,而此时2的索引为2,不满足,被PASS,这里就是巧妙的借用了indexOf始终查找到第一次出现的位置。
4.双层for循环+额外数组
let arr = [1,1,13,4,4,5,6,77,8,8,9]
let n1 = [];
for (let i = 0; i < arr.length; i++) {
let j = null;
for (j = 0; j < n1.length; j++) {
if (arr[i] === n1[j]) break;
}
if (j == n1.length) n1.push(arr[i])
}
console.log(n1)
- map实现
//map的实现算是比较简单的,map同样会对重复的元素进行过滤,
//最后map.keys进行结构然后返回到一个数组中
function unique(arr) {
let map = new Map()
for(let item of arr){
map.set(item,true)
}
return [...map.keys()]
}
console.log(unique([1,2,1,2,3,4,5])) // 输出:[1, 2, 3, 4, 5]