1.两个for循环
缺点:对象和 NaN 不去重
注意: splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
for (let i = 0, len = num.length; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (num[i] == num[j]) {
num.splice(j, 1);
len--;
j--;
}
}
}
//方法笨拙,如果数组长度很大,效率会很低
2.filter + indexOf
思路:利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等
注意: 对象不去重 ,NaN 会被忽略掉
indexOf 底层使用的是 === 进行判断,使用 indexOf 查找不到 NaN 元素
arr.indexOf(NaN); // -1
var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
num = num.filter((item, index) => {
return num.indexOf(item) == index;
});
3.for循环+indexof
let newArr = [1,2,4,5,6,6]
for (var i = 0, len = arr.length; i < len; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i])
}
}
4.sort()排序 + for循环
思路:利用sort,再判断相邻位置是否有相同的
注意:Set可以去重NaN类型,不去重对象
var num = [1, 2, 6, 4, 5, 6, 3, 6, 5];
num = num.sort();
var s=[];
for(let i=0,len=num.length;i<len;i++){
if(num[i]!=num[i+1]){
s.push(num[i])
}
}
let arr = [1, 3, 6, 6, 8, 8, 9, 4, 5, 4, 9];
let newArr = arr.sort();
let s= newArr.filter((item, index) => {
return newArr[index] != newArr[index + 1]
})
5.Es6的... + new set()
注意:对象不去重 NaN 去重
思想: ES6 提供的数据结构 Set,它一个特性就是成员值都是唯一的,没有重复的值。
var num = [1, 2, 6, 4, 5,8, 6, 3, 6, 5,7,8,9];
num = [...new Set(num)];
耗时:
双重 for 循环 > Array.filter()加 indexOf > Array.sort() 加一行遍历冒泡 > ES6中的Set去重 > Object 键值对去重复