ES6学习之set和map数据结构

337 阅读3分钟

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]