使用Set
var a1 = [1,2,3,3,2,1]
var uniq = function(a){
return Array.from(new Set(a))
// or
return [...new Set(a)]
}
uniq(a1)
[1, 2, 3]
使用计数排序的思路
var a1 = [1,2,3,3,2,1]
var uniq = function(a){
var 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
}
const result = []
for(let key in map){
result.push(key)
}
return result
}
uniq(a1)
['1', '2', '3']
缺点
只支持字符串,因为普通对象的key只支持字符串和Symbol,所以这个方法只能把数字转换为字符串。
当然,也可以通过parseInt()转换,但是当我们同时存在数字1和字符串1时,就无法区分了。如下:
var a1 = ['1',2,3,1,2]
uniq(a1)
['1', '2', '3']
// '1' 和 1 应该是不同的,但是这里却按照相同的处理了。
使用 Map完美解决
var a1 = ['1',2,3,3,2,1]
var uniq = function(a){
var 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()]
}
uniq(a1)
['1', 2, 3, 1]