es6 入门(四):Set和Map数据解构

来源:互联网 发布:适合家政的软件 编辑:程序博客网 时间:2024/06/14 00:30

1、Set  是es6提出的一种数据解构,类似于数组,但是与数组有一个很大的区别:Set中的数据是没有重复的,也就是说所有的值都是唯一的。

针对这一特性可以用set对数组进行去重。如:

const s = new Set();[2, 3, 5, 4, 5, 2, 2,8].forEach(x => s.add(x));for (let i of s) {  console.log(i);}// 2 3 5 4 8
let arr = Array.from(new Set([1,2,4,6,3,6,3,7,4]));for(let i=0;i<arr.length;i++){console.log(i);  // 1 2 4 6 3 7

Set去重是采用 ===(全等) 方式进行判断的,不存在类型转换 也就是说1与'1'是不同的。在es6入门(三)点击打开链接 中介绍过,NaN是一种特殊的数字类型,自身都不相等。但是在es6的Set中NaN是与自身相等的。也就是说向Set中可以有重复的NaN出现,对象也是一样。

let set  = new Set();set.add(1);set.size;//1set.add('1');set.size;//2set.add(NaN);set.size;//3set.add(NaN);set.size;//3set.add({});set.size;//4set.add({})set.size;//5

2、Set方法的介绍:

(a):操作方法:add()、has()、delete()、clear()

let s = new Set();s.add(1).add(3).add(2);// 注意2被加入了两次s.size // 3s.has(1) // trues.has(2) // trues.has(3) // trues.delete(2);s.has(2) //false

(b)遍历方法:键名:keys()、键值:values()、键值对entries()、遍历所有成员foreach()

在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、blue
for (let item of set.entries()) {  console.log(item);}// ["red", "red"]、 ["green", "green"]、["blue", "blue"]
Set中的成员可以用for...of 进行遍历

let s = new Set([1,2,3]);for(let i of s){console.log(i);//1  2  3}
s.foreach((value,key)=>console.log(value+1));   //  2   3   4
在使用foreach时要注意参数的顺序,第一个参数是键值,第二个参数是键名。

3、weakSet与Set数据解构类似,但是有两点主要的区别:一是:weakSet中只能存放对象,而不能存放其他类型的数据;二是:weakSet是弱引用,只要外部对象不引用它,就会被垃圾回收机制回收。所以在weakSet中最好值存放临时的一些数据。


4、Map数据解构

Map数据结构是键值对的形式的数据解构,但是Map解构的键与传统的键是不同,传统的键只能是字符串,而Map的键可以是任何数据类型都可以,如数字、字符串、undefined等。

注意:Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。

如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0-0就是一个键,布尔值true和字符串true则是两个不同的键。另外,undefinednull也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。

5、Map方法的介绍:

属性及方法:

(a)、size返回Map解构的成员总数

const map = new Map();map.set('foo', true);map.set('bar', false);map.size // 2

(b)、set(key,value)

const m = new Map();m.set('edition', 6)        // 键是字符串m.set(262, 'standard')     // 键是数值m.set(undefined, 'nah')    // 键是 undefined
Map可以像jQuery那样,进行链式操作。

(c)、get(key)

const m = new Map();const hello = function() {console.log('hello');};m.set(hello, 'Hello ES6!') // 键是函数m.get(hello)  // Hello ES6!

(d)、has(key)//返回boolean

(e)、delete(key)//删除

(f)、clear()//清除所有


遍历方法:

遍历的方法与Set数据解构的方法是一样的。


****************************************************

Map与其他数据结构的 转换

最主要的就是与数组之间的转换:

(1)、Map 转为数组

前面已经提过,Map 转为数组最方便的方法,就是使用扩展运算符(...)。const myMap = new Map()  .set(1, 7)  .set({undefined: 3}, ['abc']);[...myMap]// [ [ 1, 7 ], [ { undefined: 3 }, [ 'abc' ] ] ]
(2)、数组 转为 Map
将数组传入 Map 构造函数,就可以转为 Map。new Map([  [1, 7],  [{undefined: 3}, ['abc']]])// Map {//   1 => 7,//   Object {undefined: 3} => ['abc']// }

原创粉丝点击