Maps 和 Sets

ES6 引入四种新的数据结构:Map, WeakMap, Set, WeakSet。

Map

new Map(iterable)

const map = new Map([
  [1, 'a'],
  [2, 'b'],
  [3, 'c']
])

object 的 keys 为 String 或 Symbol,map 的 keys 可以是任意类型。keys 唯一,采用 SameValueZero 判断相等。

map 默认的遍历方式是 entries()

map[Symbol.iterator] === map.entries // true
for (const [key, value] of map) {
  console.log(key, value)
}
// 只遍历 keys
for (const key of map.keys()) {
  console.log(key)
}

Map.prototype.forEach((value, key, map) => {}, thisArg) 注意第一个参数为 value,这是为了和 Array.prototype.forEach 一致。

map.forEach((value, key) => {
  console.log(key, value)
})

过滤

const filteredMap = new Map(
    [...map] // 将 map 转为数组 [[k1, v1], [k2, v2], ...]
    .filter(([key, value]) => key < 3)
)

WeakMap

WeakMap 是特殊的 Map, 不会阻止回收它的 keys,有下面限制

WeakMap 这些特点比较适合做 cache。

Set

new Set(iterable)

new Set(['foo', 'bar']) // {"foo", "bar"}
new Set('foo', 'bar') // {"f", "o"},Set 只有一个参数,这种情况多半是上面的误写

Set 集合的元素唯一,采用 SameValueZero 判断相等。

数组去重

const arr = [1, 1, 2]
const uniq = [...new Set(arr)]

集合运算

思路是将两个集合转为数组,对数组操作,然后创建新集合。

const a = new Set([1,2,3]);
const b = new Set([4,3,2]);

并集 Union (a ∪ b)

new Set([...a, ...b])

交集 Intersection (a ∩ b)

new Set([...a].filter(x => b.has(x)))

差集 Difference (a - b),属于 a 但不属于 b

new Set([...a].filter(x => !b.has(x)))

WeakSet

WeakSet 是特殊的 Set, 不会阻止回收它的元素,因此它的限制跟 WeakMap 类似

参考