Set
基本用法
ES6提供了新的数据结构Set。它类似数组,但是成员都是唯一的,不允许重复。其本身是一个构造函数,用来生成Set数据结构。
const set = new Set([1, 2, 3, 4, 4]);
const sets = new Set(document.querySelectorAll('div'));
Set函数可以接受一个数组或者具有iterable接口的其他数据结构作为参数,用来初始化。
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
上面代码也展示了一种去除数组重复成员的方法。
[...new Set('ababbc')].join('')
上面的方法也适用于字符串去除重复的字符。==也可扩展为字符串去除空格的方法==
[...new Set(' a ba bb c')].join('').substr(1)
向Set加入值的时候,不会发生类型转换。所以,5和'5'是两个不相同的值。==另外,两个对象总是不相等的。==
Set实例的属性和方法
Set实例有以下属性:
Set.prototype.constructor:构造函数,默认就是Set函数。Set.prototype.size:返回Set实例的成员总数。
Set实例的方法分为两大类:操作方法(操作数据)和遍历方法(遍历成员)。
操作方法:
add(value):添加参数,返回添加之后的数据;delete(value):删除参数,返回是否删除成功的布尔值;has(value):返回判断是否包含该成员的布尔值;clear(value):清除所有参数,没有返回值;
遍历方法
在阮一峰老师的《ECMAScript 6 入门》中提到了keys()、values()、entries()、forEach()四种方法。个人在工作中用到的并不多,更多的用到了for...of 遍历方法。
以扩展运算符作为中间桥梁,数组的map方法和filter方法也可以间接的用于Set。
const divS = new Set(document.querySelectorAll('.explain-item'));
let sets = [...divS].map(x => x.innerHTML = x.innerHTML + 'map拼接参数');
使用map方法快速的遍历页面中的DOM元素,并修改其值。
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
使用Set配合filter方法和扩展运算符可以很容易的实现并集、交集和差集。
Map
Map是一组键值对的结构,具有相对快的查找速度。其类似于对象,但是'键'的范围不限于字符串,各种类型的值都可以都可以当做键。初始化Map需要一个二维数组或者直接初始化一个空Map。
const $map = new Map();
const $num = 1;
const $str = '1';
const $arr = [1, 2, 3, 4];
const $null = null;
const $undefined = undefined;
const $obj = {a: 1, b: 2}
$map.set($num, 10)
.set($str, '10')
.set($arr, [4, 3, 2, 1])
.set($null, null)
.set($undefined, undefined)
.set($obj, {c: 3, d: 4});
上面代码展示了Map不仅可以用基础数据类型当做键,甚至可以将数据和对象当做键。上面代码使用set方法向Map添加数据。map总共有下面几种操作数据的方法。
- set(key, value):采用键值对的形式向map添加数据,如果已经有该key值,则更新;否则会添加。返回当前的Map对象,因此可以采用链式写法;
- get(key):读取对应key的键值,如果没有则会返回undefined;
- delete(key):删除对应key的键值,返回是否成功的布尔值;
- has(key):返回是否包含某个key的布尔值;
- clear():用于清除所有成员,没有返回值。
- size属性:返回map数据的成员总数。(布尔值)
遍历
个人感觉遍历map比较合适的方法是for...of,既能遍历key,又能遍历value。
for (let key of $map.keys()) {
console.log(key);
}
for (let value of $map.values()) {
console.log(value);
}
for (let [key, value] of $map) {
console.log(key, value);
}
扩展运算符[...]可以很方便将map转换为数组,结合数组的map方法和filter方法,可以实现Map本身的遍历和过滤。(Map本身没有map和filter方法)。
[...$map.keys()]
[...$map.values()]
[...$map]