一、Set的特性
它类似于数组,但是成员的值都是唯一的,没有重复的值。
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
2、Map的特性
它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
[...map.keys()];
// [1, 2, 3]
[...map.values()];
// ['one', 'two', 'three']
[...map.entries()];
// [[1,'one'], [2, 'two'], [3, 'three']]
[...map];
// [[1,'one'], [2, 'two'], [3, 'three']]
Map在调用拓展运算符时,会调用iterator接口,并且返回数组;另外在应用for…of 语句时也会调用iterator接口时,也是返回数组,因此解构赋值需使用下文结构。
let map = new Map([[1, 2], [2, 3]])
for (let [key, value] of map) {
...
}
可以对Map结构进行筛选,通过数组的fetch和map方法,Map实例并没有该方法
const map0 = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
const map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
// 产生 Map 结构 {1 => 'a', 2 => 'b'}
const map2 = new Map(
[...map0].map(([k, v]) => [k * 2, '_' + v])
);
// 产生 Map 结构 {2 => '_a', 4 => '_b', 6 => '_c'}