1.indexOf去重
优点:该方法可以顾虑到重复的 String、Boolean、 Number、undefined、null,返回的是去重后的新数组。
缺点:不能过滤掉 NaN、Object
let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
let newArr = []
for(let i = 0; i < arr.length; i++) {
if(newArr.indexOf(arr[i]) < 0) {
newArr.push(arr[i])
}
}
console.log(newArr) // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]
2.includes去重 返回新数组
优点:该方法可以顾虑到重复的 String、Boolean、Number、undefined、null、NaN,返回的是去重后的新数组。
缺点:不能过滤掉 Object
let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
let newArr = []
for(let i = 0; i < arr.length; i++) {
if(!newArr.includes(arr[i])) {
newArr.push(arr[i])
}
}
console.log(newArr) // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
3.利用ES6的Set数据结构的特性
优点:该方法可以顾虑到重复的 String、Boolean、Number、undefined、null、NaN,返回的是去重后的新数组。
缺点:不能过滤重复的Object。
let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
arr=Array.from(new Set(arr))
console.log(arr) // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
4.利用对象的属性key唯一的特性去重
优点:该方法可以顾虑到重复的 String、Boolean、Number、undefined、null、NaN、Object,返回的是去重后的原数组。
缺点:针对 NaN和’NaN’,对象的key会视为一个key,区分不了 NaN 和 ’NaN’(字符串)。
let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
let obj = {}
let newArr = []
for(let i = 0; i < arr.length; i++) {
if(!obj[arr[i]]){
obj[arr[i]] = 1
newArr.push(arr[i])
}
}
console.log(newArr) // [1, 'true', 15, false, undefined, null, NaN, 0, 'a', {…}]