ES6 -- 新的数据结构:Set和Map

来源:互联网 发布:光环国际教育 大数据 编辑:程序博客网 时间:2024/05/30 23:30

Set

Set是和数组类似的数据结构,但是Set中,所有的成员值都是唯一的,也就是,没有重复值。
创建一个Set可以使用new Set()方法:

const set = new Set();

然后,可以通过add()方法向set中添加成员。

set.add(1);

如果在add过程中,添加了重复的成员,那么该成员将会被忽略。

另外,也可以直接向Set()中传递一个(类)数组作为参数来初始化一个新的set对象。

const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);items.size // 5,可见重复的元素被忽略了

关于重复元素的说明:
1、向set中加入值的时候,不会发生类型转换。这也就意味着,1、“1”将会是两个不同的元素。
2、在JS中,我们知道,NaN是和自身不想等的,但是在set中,加入多个NaN则只会保存一个。(set认为NaN===NaN)
3、var a = {name:"xiaoming"}var b = {name:"xiaoming"}是不相等的两个对象。

Set的属性和方法

1、size:返回set实例的元素数目

2、add():为Set添加元素。返回Set实例本身。这也就意味着,add()方法可以链式调用。

3、delete():删除某个值,返回布尔值表示是否成功删除。

4、has():查询set实例中是否有某个值,返回对应的布尔值。

5、clear():清除所有成员,无返回值。

6、
keys():返回set实例所有键名的遍历器
values():返回set实例所有键值的遍历器
entries():返回set实例所有键值对的遍历器
注:set中 键值 = 键名 = set元素本身
栗子:

let set = new Set(['red', 'green', 'blue']);for (let item of set.keys()) {  console.log(item);}// red// green// bluefor (let item of set.values()) {  console.log(item);}// red// green// bluefor (let item of set.entries()) {  console.log(item);}// ["red", "red"]// ["green", "green"]// ["blue", "blue"]

7、forEach():与Array.forEach()方法类似,可以使用回调函数遍历所有成员。
另外,set数据结构有自己原生的[Symbol.iterator],可以用for of方法直接遍历:

let set = new Set(['red', 'green', 'blue']);for (let x of set) {  console.log(x);}// red// green// blue

Map

不知道大家在使用ES5的Object对象的时候会不会有这样的不适:当你使用一个Object来作为键的时候,它被自动的转换为”[object Object]”这样的东西。这是因为,Object只能使用字符串来当作键,如果不是字符串,将会被自动转化为String。

Map就是为了解决这个问题而出现的新的数据结构,它允许任何类型的数据结构充当键。

const m = new Map();const o = {p: 'Hello World'};m.set(o, 'content')m.get(o) // "content" 成功!

初始化方法:

可以使用new Map() 来新建一个Map实例,同时,该方法可以接受一个数组A作为参数,数组A的元素是一个或多个数组——这些数组内仅包含两个元素,作为Map内成员的的键和值。

栗子:

const map = new Map([  ['name', 'Emily'],// 键:name ;值:‘Emily’  ['age', 18]]);map.size // 2map.has('name') // truemap.get('name') // "Emily"map.has('age') // truemap.get('age') // 18

Map规则:

如果对同一个键多次赋值,那么,后面的值将会覆盖前面的。

如果读取一个没有赋值的键,将返回undefined。

注意:

const map = new Map();map.set(['a'], 555);map.get(['a']) // undefinedmap.set({a:"a"}, 555);map.get({a:"a"}) // undefined

这是因为,[‘a’]和[‘a’],{a:”a”}和{a:”a”}虽然表面看上去一样,但他们的内存地址是不同的,它们被视为两个不同的值。(同set的判断元素是否重复的规则很像)

* Map的属性和方法 *

1、属性size:返回map结构的成员(键值对)总数

2、map.set(key,value):为map添加键值对。如果该键为新键则添加,否则就覆盖原有的值。

3、map.get(key):获取对应的值,如果找不到key,就返回undefined。

4、map.has(key):判断这个键是否存在,返回true或false。

5、map.delete(key):删除以key为键的键值对,成功返回true,否则返回false。

6、map.clear():清除所有成员。

7、
keys():返回Map实例所有键名的遍历器。
values():返回Map实例所有键值的遍历器。
entries():返回Map实例所有键值对的遍历器。
forEach():遍历Map实例所有成员。
(遍历顺序即插入顺序)

总结一下就是,
Set:值不重复的数组。
Map:可以采用任何数据结构作为键值的Object。

0 0
原创粉丝点击