对于数组项为基本类型(基本为数字或字符串)的:
- 使用filter数组去重
var arr = [1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 7]
function fn(arr) {
return arr.filter((x, index, self) => self.indexOf(x) === index)
}
比较简单粗暴,利用indexOf只会找到第一个匹配项的下标这个特性,忽略重复的数组项。
- 利用对象的key去重
var arr = [1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 7]
function fn(arr) {
let hashTable = {}
let data = []
for (let i = 0; i < arr.length; i++) {
if (!hashTable[arr[i]]) {
hashTable[arr[i]] = true
data.push(arr[i])
}
}
return data
}
利用了对象的key值去重,当然,对于这种数组项为基本类型的数组,去重还有很多方法,es6出了Set这种数据类型,对普通数组的去重更是简单粗暴。
但在工作中,去重的需求并不是那么简单,往往数组是一个对象数组,然后根据其中的某一个字段去重,对于这种需求,我们还是可以用上面的方法,利用对象的key值去重:
let arr1 = [{id: 1}, {id: 2}, {id: 3}, {id: 4}]
let arr2 = [{id: 5}, {id: 2}, {id: 3}, {id: 8}]
// 比如这个,两个数组合并然后根据id这个字段去重
function fn(arr1,arr2){
let arr = arr1.concat(arr2)
let hashTable = {}
let data = []
for (let i = 0; i < arr.length; i++) {
if (!hashTable[arr[i].id]) {
hashTable[arr[i].id] = true
data.push(arr[i])
}
}
return data
}
觉得这个利用key值的方式还是挺万能的,之后看到还有好的方式超人鸭也会继续添加在这篇文章里面。