① Set + Array.from()
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
Array.from() 方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
var arr = [1,1,2,2,3,3,4]
var uniq = function(x){
return Array.from(new Set(x))
}
uniq(arr) //[1,2,3,4]
② map
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
map可以保留字符串也可以保留数字 能够滤掉相同的字符串也能滤掉相同的数字 但是如果同时有 比如数字1和字符串'1' 这两个都会保留
a1 = ['1','2',3,3,4,4,5]
var uniq = function(a){
var map = new Map()
for(let i=0;i<a.length;i++){
let number = a[i]
if(map.has(number)){
continue
}
map.set(number,true)
}
return [...map.keys()]
}
uniq(a1) //['1','2',3,4,5]
③ 计数排序的思路
这种方法的缺点:
产出的其实是字符串 想要数字就再加个parseInt
如果原数组中既有字符串又有数字 比如 "1" 和数字1 只会留两者之一
var a1 = [1,2,2,3,3]
var uniq = function(a){
var map = {}
for(let i=0;i<a.length;i++){
let number = a[i]
if(number in map){
continue
}
map[number] = true
}
return Object.keys(map)
}
uniq(a1) //['1', '2', '3'] 产出的其实是字符串
如果不用Object.keys()
var a1 = [1,2,2,3,3]
var uniq = function(a){
var map = {}
for(let i=0;i<a.length;i++){
let number = a[i]
if(number in map){
continue
}
map[number] = true
}
const result = []
for(let key in map){
result.push(key) //这里其实还是字符串
//result.push(parseInt(key)) 想得到数字就使用parseInt
}
return result
}
uniq(a1) //['1','2','3']