- 使用 Set
const uniq = (a) => {
return [...new Set(a)]
}
- 使用计数排序的思路
const uniq = function(a){
let map = {}
for(let i =0;i < a.length;i++){
let number = a[i]
if(number === undefined){continue}
if(number in map){continue}
map[number] = true
}
return object.keys(map)
// or use for...in
}
因为object的key值只能是字符串或symbol,所以该代码的缺点是只支持字符串
- 弥补2的缺点
let remove = function(arr) {
let obj = {}
for(let i = 0;i<arr.length;i ++) {
if(!obj[arr[i]]){
obj[arr[i]] = true
} else {
arr.splice(i,1)
i--
}
}
}
- 用 Map
const uniq = function(a){
let map = new Map()
for(let i =0;i < a.length;i++){
let number = a[i]
if(number === undefined){continue}
if(map.has(number)){continue}
map.set(number, true)
}
return [...map.keys()]
}
这个方法除了兼容不太好,没啥问题。因为 Map 的 key,不单单是字符串。
- 使用 filter
const removeDuplicate = function(arr){
return arr.filter((value,index) => arr.indexOf(value) === index)
}
- 在原数组上去重
const removeDuplicate = function(arr){
let set = new Set()
for(let i = 0;i < arr.length;i++){
let num = arr[i]
if(!set.has(num)){
set.add(num)
} else {
arr.splice(i,1)
i--
}
}
}
- 如果你想去重内容相同的数组或对象
// 例如 const arr = [3, 3, {a: 1}, {a: 1}, [3,4,5], [3,4,5], 'a', 'a']
// 你可以这样去做
function removeDuplicate(arr) {
let set = new Set()
return arr.filter(v => {
if(typeof v === 'object' && v!== null) {
v = JSON.stringify(v)
}
if(set.has(v)) return false
set.add(v)
return true
})
}