数组去重的方法总结:
待去重数组
let arr = [1,1,2,3,6,6,6,6,7,8,7,9,]
- 双重 for 循环 (NaN 不能去重)
function unique(arr=[]) {
//默认值
let length = arr.length
for (let i = 0; i < length-1; i++) {
for (let j = i + 1; j < length; j++) {
console.log('i', arr[i],':j',arr[j])
if(arr[i]===arr[j]) {
arr.splice(j,1)
i--
length--
}
}
}
return arr
}
console.log(unique(arr))
//结果: [1, undefined, null, NaN, NaN, 11, 2, 3, 9, 8, 6, 7]
- for 循环 使用 indexOf || includes 简化
//ES6 includes() 检测数组当中是否包含某个值
function unique(arr) {
let result = []
for (let i = 0; i < arr.length; i++) {
if (!result.includes(arr[i])) {
result.push(arr[i])
}
}
return result
}
//[1, undefined, null, NaN, 11, 2, 3, 9, 8, 6, 7]
//ES5 使用 indexOf 检测某个值第一次出现的位置
function unique(arr) {
let result = []
for (let i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i])===-1) {
result.push(arr[i])
}
}
return result
}
//[1, undefined, null, NaN, NaN, 11, 2, 3, 9, 8, 6, 7]
//indexOf 相较于 includes 的缺点:
//由 indexOf 的作用可以知道,indexOf 的结果需要与 -1(数组当中不存在该值) 进行比较
//由于indexOf 内部是使用 === 来进行判断所以会对NaN进行误判
//[NaN].indexOf(NaN) ======== 结果-1
- 先排序再去重
function unique(arr = []) {
if (!(arr instanceof Array)) return
arr = arr.sort((a, b) => a - b)
let length = arr.length
for(let i = 0; i< length-1;i++) {
if(arr[i] === arr[i+1]) {
arr.splice(i+1,1)
i--
length--
}
}
return arr
}
console.log(unique(arr))
//结果: [null, 1, 2, 3, 6, 7, 9, NaN, NaN, 6, 7, 8, 9, 11, undefined]
- ES6 Set 数据结构
//Set 数据结构
[...new Set(arr)]
Array.from(new Set(arr))
//[1, undefined, null, NaN, 11, 2, 3, 9, 8, 6, 7]
- 利用 filter 去重
function unique(arr=[]) {
if (!(arr instanceof Array)) return
let result = arr.filter((item,index) =>index === arr.indexOf(item))
return result
}
//结果: [1, undefined, null, 11, 2, 3, 9, 8, 6, 7]
总结: 在这 5 中去重的方式中,只有 Set includes(ES6特性)才能去掉NaN