如何用Set实现数组去重?
var arr = [1,2,2,3,3,3,4,4]
const uniq = function(a) {
// new Set得到值的集合
// 然后将值的之和变成数组
return Array.from(new Set(a))
// return [...new Set(a)] // 也可以用展开运算法转化成数组
}
const arr2 = uniq(arr)
arr2 // [1,2,3,4]
用记数排序的方式实现数组去重
let arr = [1,1,2,2,2,3,3,3,4,4,4,4,4,]
var uniq = function(a) {
var obj = {}
//遍历数组a,让obj拥有不重复的key
for(let i = 0;i<a.length;i++) {
// 得到数组中各索引的值
let number = a[i] // 以上的arr为例,那么值就是1,2,3,4
// 判断number是否为obj对象的属性
if(number in obj) {
// 如果number已经是它的属性了,那么就直接进行下一个循环
continue
}
// 把number作为obj的key,设置为true
obj[number] = true
}
const result = []
// for-in遍历obj,得到obj的key
for(let key in obj) {
// 把这些独一无二的key,push到result数组中
result.push(key)
}
return result
}
这样做的缺点是什么?
- 只能变成字符串
- 如果既有数组,又有字符串,那么也是分不出来的(会将它们合二为一)
用记数排序跟Map实现数组去重
let arr = [1,,,,'2',1,2,2,2,3,3,3,4,4,4,4,4,]
var uniq = function(a) {
var map = new Map()
for(let i = 0; i<a.length; i++) {
let number = a[i]
// 如果map中已经有number这个key
if(map.has(number)) {
// 进入下一个循环
continue
}
// 给map设置属性,key为number
map.set(number,true)
}
// 得到map中的所有key,然后将它们用展开运算符转化成数组
return [...map.keys()]
}
uniq(arr)
用filter跟Map实现数组去重
function uniqueFunc(arr) {
const map = new Map();
// map.has判断map中是否有某个key
// map.set为map中设置一个key(键名与键值)
// 如果map中没有item作为key,那么就为map添加一个key,这个key就是item,要传入的键值随意,写1也可以
return arr.filter((item) => !map.has(item) && map.set(item, true));
}
其他知识
Set
-
作用是什么
- Set对象是值的集合,你可以按照插入的顺序迭代它的元素。
- Set 中的元素只会出现一次,即 Set 中的元素是唯一的。
Array.from
-
作用是什么
- 把集合变成数组
- 一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例
- 返回一个新的数组实例。
-
简单的例子
展开运算符实现数组
for(in)
- 判断一个属性是否属于一个对象
稀疏数组
- 什么是稀疏数组
- 就是包含从0开始的不连续索引的数组
- 简单例子
[1, ,2]