ES6 Set和Map数据结构
Set
基本用法
set类似于数组,但是成员的值都是唯一的,没有重复的值
let set = new Set()
const arr = [1,2,3,1,2,3]
arr.forEach(n => {
set.add(n)
})
for(let n of set) {
console.log(n)
}
// 1 2 3
上面的代码用add()
方法向set中添加数据,结果表明没有重复的值
Set
的构造函数可以接受一个数组作为参数
使用Set
对数组去重
const arr = [1,2,3,1,2,3]
const set = new Set(arr)
console.log([...set]) // [1 2 3]
向set中添加数据时不会发生类转换,5和'5'是两个不同的值,并且add()
方法会返回当前Set对象,可以使用链式写法
const set = new Set()
.add(5)
.add('5')
console.log([...set]) // [5, '5']
Set 实例的属性和方法
Set 结构的实例有以下属性。
Set.prototype.constructor
:构造函数,默认就是Set函数。
Set.prototype.size
:返回Set实例的成员总数。
Set 操作方法:
add(value)
:添加某个值,返回 Set 结构本身。
delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。
has(value)
:返回一个布尔值,表示该值是否为Set的成员。
clear()
:清除所有成员,没有返回值。
const set = new Set()
set.add(1).add(2).add(3) // [1,2,3]
set.delete(1) // true
set.has(1) // false
set.has(2) // true
set.clear() // []
Set 遍历方法:
Set 结构的实例有四个遍历方法,可以用于遍历成员
Set的遍历顺序就是插入顺序
keys()
:返回键名的遍历器
values()
:返回键值的遍历器
entries()
:返回键值对的遍历器
forEach()
:使用回调函数遍历每个成员
const set = new Set()
set.add('red').add('pink').add('green')
for (let item of set.keys()) {
console.log(item)
}
// red
// pink
// green
for (let item of set.values()) {
console.log(item)
}
// red
// pink
// green
for (let item of set.entries()) {
console.log(item)
}
// ["red", "red"]
// ["pink", "pink"]
// ["green", "green"]
Set的实例默认可遍历,直接用for...of循环遍历Set
const set = new Set()
set.add('red').add('pink').add('green')
for (let item of set) {
console.log(item)
}
// red
// pink
// green
Map
Map数据结构类似于对象,都是键-值对的集合,但是Map的'键'的范围不限于字符串,而是包括各种类型的数据
const o = {
name: 'tom',
age: 12
}
let map = new Map()
map.set(o, 'content')
map.get(o) // content
Map的构造函数接受任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构作为参数
let map = new Map([
['name', 'tom'],
['age', 12]
])
map.get('name') // tom
map.get('age') // 12
Map的键是跟内存地址绑定的,只要内存地址不一样就视为不同的键
let map = new Map()
map.set([1], 'a')
map.get([1]) // undefined
上面的代码中两个[1]
在内存中的地址不同,因此对Map来说并不是同一个键
Map的实例属性和方法
size
属性:返回Map结构成员总数
let map = new Map()
map.set('name', 'tom')
map.set('age', 12)
map.size // 2
set(key, value)
:设置key对应的值为value,如果key已存在则更新key的值,返回当前Map对象,可采用链式写法
let map = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
get(key)
: 返回key对应的value,如果key不存在则返回undefined
has(key)
:判断某个键是否在Map对象中,返回布尔值
delete(key)
:删除某个键,成功返回true
,失败返回false
clear()
:清除所有成员,没有返回值
Map遍历方法
Map 的遍历顺序就是插入顺序
keys()
:返回键名的遍历器。
values()
:返回键值的遍历器。
entries()
:返回所有成员的遍历器。
forEach()
:遍历 Map 的所有成员。
let map = new Map()
map.set('name', 'tom')
map.set('age', 12)
for (let item of map.keys()) {
console.log(item)
}
// "name"
// "age"
for (let item of map.values()) {
console.log(item)
}
// "tom"
// 12
for (let [key, vaue] of map.entries()) {
console.log(key, vaue)
}
// "name" "tom"
// "age" 12
map.forEach((value, key) => {
console.log(value, key)
})
// "tom" "name"
// 12 "age"