JS Set、Map数据结构
1. Set
类似于数组 Array,Set 中的值都是唯一的,因此常用于去重
内置迭代器,可以遍历,可以转换成数组
let arr = [1,2,3,4,3,2]
let s1 = new Set(arr)
console.log(s1) // Set(4) {1, 2, 3, 4}
console.log([...s1]) // [1, 2, 3, 4]
console.log(Array.from(s1)) // [1, 2, 3, 4]
// 属性与方法
// 1. add() 方法: 往 Set 中加入一个值
let s2 = new Set()
s2.add(1)
s2.add(2)
s2.add(3)
s2.add(4).add(5).add(6)
console.log(s2) // Set(6) {1, 2, 3, 4, 5, 6}
// 2. clear()方法: 清空 Set
s2.clear()
console.log(s2) // Set(0) {}
// 3. delete()方法: 删除 Set 中某个值
s2.delete(4)
console.log(s2) // Set(5) {1, 2, 3, 5, 6}
// 4. has()方法: 判断 Set 中是否包含某个值,返回 true 或 false
console.log(s2.has(4)) // true
console.log(s2.has(8)) // false
// 5. keys()方法: 返回键名的遍历器,Set 中键名就是键值
// values()方法: 返回键值的遍历器
// entries()方法: 返回键值对的遍历器
// foreach()方法: 遍历每个成员
for(let i of s2.keys()) {
console.log(i) // 1,2,3,4,5,6
}
for(let i of s2.values()) {
console.log(i) // 1,2,3,4,5,6
}
for(let i of s2.entries()) {
console.log(i) // [1,1] [2,2] [3,3] [4,4] [5,5] [6,6]
}
s2.forEach(item => console.log(item)) // 1,2,3,4,5,6
利用 Set 结构对复杂数组去重:
let arr = [1,2,2,"test1","test1",[1,2],[1,2],{name: "testName"},{name: "testName"},{age: "22"}]
let s1 = new Set()
let resArr = arr.filter((item) => {
let n = JSON.stringify(item)
if (s1.has(n)) {
return false
} else {
s1.add(n)
return true
}
})
console.log(resArr)
// [1,2,"test1",[1,2],{name: "testName"},{age: "22"}]
2. Map
类似于对象 Object,但是 Map 中的键名不限于字符串,甚至可以是一个 object
内置迭代器,可以遍历,可以转换成数组
let m1 = new Map([["name", "testName"], ["age", 10], [{a:1}, "gsa"]])
console.log(m1) // Map(3) {"name" => "testName", "age" => 10, {…} => "gsa"}
console.log([...m1]) // [["name", "testName"], ["age", 10], [{…}, "gsa"]]
console.log(Array.from(m1)) // [["name", "testName"], ["age", 10], [{…}, "gsa"]]
// 属性与方法
// 1. set(key, value)方法: 往 Map 中添加一个键值对,第一个参数为键值,第二个参数为键值
let m2 = new Map()
m2.set("name", "test")
m2.set("age", 22)
m2.set({a:1}, "gsa")
console.log(m2) // Map(3) {"name" => "testName", "age" => 22, {…} => "gsa"}
// 2. get(key)方法: 获取键值
console.log(m2.get("name")) // test
// 3. has(key)方法: 判断键是否存在
console.log(m2.has("name")) // true
// 4. delete(key)方法: 删除指定键
m2.delete("name")
console.log(m2) // Map(2) {"age" => 22, {…} => "gsa"}
// 5. clear()方法: 清空 Map
m2.clear()
console.log(m2) // Map(0) {}
// 6. keys()方法: 返回键名的遍历器
// values()方法: 返回键值的遍历器
// entries()方法: 返回键值对的遍历器
// foreach()方法: 遍历每个成员
for(let i of s2.keys()) {
console.log(i) // name, age, {a: 1}
}
for(let i of s2.values()) {
console.log(i) // test, 222, gsa
}
for(let i of s2.entries()) {
console.log(i) // ["name", "test"],["age", 22],[{…}, "gsa"]
}
s2.forEach(item => console.log(item)) // test, 222, gsa