Set数据结构
简单来说set就类似一个去重的数组。
- add
- size
- has
- delete
- clear
let a1 = new Set([1,1,2,2,3,3]) //定义一个Set
console.log(a1) //Set(3) {1, 2, 3}
console.log(a1.size) // 3 返回set的长度
console.log([...a1]) //[1, 2, 3] 因为Set包含iterator接口,所以可以通过展开运算符变成数组
console.log(Array.from(a1)) //[1, 2, 3] // 普通变数组方法
a1.add(4) // 添加元素
a1.add(4)
a1.add(5)
console.log(a1) //Set(5) {1, 2, 3, 4, 5}
console.log(a1.has(4)) // true 是否包含元素
console.log(a1.delete(4)) // ture 删除元素并返回true,没有该元素返回false
console.log(a1) //Set(4) {1, 2, 3, 5}
console.log(a1.clear()) //undefined 清空所有元素
- keys
- values
- entries
- forEach
这里值得注意的是 a1作为Set数据结构 去重之后是[1,2,3] 它的每一项的键名和键值都是一样的
let a1 = new Set([1, 1, 2, 2, 3, 3])
for (let i of a1.keys()) {
console.log(i) //键名
}
for (let i of a1.values()) {
console.log(i) //键值
}
for (let i of a1.entries()) {
console.log(i) // 键值对,这个可用于数组,可打印下标与值
}
a1.forEach((item, index) => {
console.log(item, index) //遍历每个对象
})
这里扩展一个set在开发中进行复杂去重的方法
let list = [1,2,2,"starry","starry",{name:"starry"},{age:18},{name:"starry"},undefined,undefined,NaN,NaN]
function uni(list){
let res = new Set()
return list.filter((item) => {
let id = JSON.stringify(item)
console.log(id)
if(res.has(id)){
return false
}else{
res.add(id)
return true
}
})
}
console.log(uni(list))
以上代码定义了一个名为 uni 的函数,用于从给定数组中筛选出唯一的元素,并返回一个新的数组。
具体的实现逻辑如下:
1.在函数开始时,定义一个空的 Set 对象 res,用于存储已经出现过的元素。
2.使用 filter 函数对输入的数组进行遍历和筛选。对于每个元素,都会执行回调函数。
3.在回调函数内部,首先将当前元素 item 转换成字符串形式,通过调用 JSON.stringify(item)。
4.然后,检查 res 集合中是否已经包含了转换后的字符串形式 id。如果是,则表示该元素已经出现过,应该不包含在结果数组中,因此返回 false。
5.如果 res 集合中不包含 id,则将其添加到 res 中,并返回 true,表示该元素需要包含在结果数组中。
6.最终,filter 函数会返回由满足条件的元素组成的新数组。对于给定的输入 list,调用 uni(list) 会返回一个只包含唯一元素的数组。
Map数据结构
类似于对象,也是键值对的集合,但是键的范围不在限于字符串,各种类型都可以当键
let m1 = new Map([
["name","starry"],
["age",18],
[{b:1},"佛罗里达州"]
])
console.log(m1)
对象也可以当键名,而且包含iterator
- set
- size
- get
- has
- delete
- clear
let m1 = new Map([
["name","starry"],
["age",18],
[{b:1},"佛罗里达州"]
])
console.log(m1)
m1.set("code",200) //添加元素
console.log(m1)
console.log(m1.get("age")) // 18 通过键名获取元素,
console.log(m1.get({b:1})) // undefined 对象无法判断,这里可以在声明一个新的变量获取
console.log(m1.has("name")) // true 判断是否包含元素
console.log(m1.delete("name")) // true
console.log(m1)
m1.clear()
console.log(m1)
- keys
- values
- entries
- forEach
参考Set
let m1 = new Map([
["name","starry"],
["age",18],
[{b:1},"佛罗里达州"]
])
for (let i of m1.keys()) {
console.log(i)
}
for (let i of m1.values()) {
console.log(i)
}
for (let i of m1.entries()) {
console.log(i)
}
m1.forEach((item, index) => {
console.log(item, index)
})