继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

深入浅出ES6教程『Set & Map数据结构』

www说
关注TA
已关注
手记 439
粉丝 83
获赞 493

大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了async函数的用法,下面我们一起来继续学习Set & Map数据结构:

学过Java的人都知道,Set是一个集合,那么在我们JavaScript中,他作为一个类数组的数据结构出现,为什么叫做类数组呢?它又有什么功能呢?它和数组有什么不同之处呢?下面我们带着疑问一起来看一下:

let arr = [1,2,5,4];console.log(arr);  // [1, 2, 5, 4]

arr输出效果:

webp

let set1 = new Set([1,2,5,4]);console.log(set1);  // {1, 2, 5, 4}

set输出效果:

webp

从上面两者输出的内容就可以看出他们的不同:
因为他没有我们数组的长度(length),只有个数(size),把个体放进一个花括号内,因此我个人还是喜欢称呼Set为一个集合,大家都应该知道,我们第一次认识这个概念的地方应该是在我们的数学课上,就有了集合的概念,其实和这个类似,除此之外set集合还有哪些特点呢?

let arr = [1,2,1];let set1 = new Set([1,2,1]);console.log(arr);   // [1, 2, 1]console.log(set1);  // {1, 2}

set集合里面的元素不会重复,也就是唯一的,默认的值是value值,没有key

既然我们数组里都有一些操作方法,那我们Set集合也有自己的方法:

  • add(value):添加某个值,一个一个的添加,返回Set结构本身

let set1 = new Set();console.log(set1);  // {}set1.add(1);
set1.add(2);console.log(set1);  // {1, 2}
  • delete(value):删除某个值,一个一个的删除,返回一个布尔值,表示删除成功

let set1 = new Set([1,2,3,4]);
console.log(set1);  // {1, 2, 3, 4}set1.delete(1);
set1.delete(2);
console.log(set1);  // {3, 4}
  • has(value):返回一个布尔值,表示Set集合里是否含有该子集

let set1 = new Set([1,2,3,4]);console.log(set1);  // {1, 2, 3, 4}console.log(set1.has(1));   // true
  • clear():清除集合里的所有成员,没有返回值

let set1 = new Set([1,2,3,4]);console.log(set1);  // {1, 2, 3, 4}set1.clear();console.log(set1);  // {}
  • forEach():使用回调函数遍历每个成员

let set1 = new Set([1,2,3,4]);
set1.forEach((value, index)=>{    console.log(value, index);//  1 1//  2 2//  3 3//  4 4});

小白:说了这么多,具体什么时候用,到底有多大用呢?
格格:它的最大用处就是数组去重,非常方便省去了很多代码:

let arr = [1,2,2,3,5,2,5,4,8,3,6,1];let set1 = new Set(arr);console.log([...set1]); // [1, 2, 3, 5, 4, 8, 6]

很简单就是将数组放到集合中,再通过扩展运算符转换成数组,转换成数组才不会被局限于那些set自带的方法,可以使用数组的所有方法,还是很灵活的,举一个例子:

exp:有一个集合set1,将该集合中的每一项加上1,返回一个新集合set2:

let set1 = new Set([1,2,3,4]);let arr = [...set1].map((val) => val + 1);let set2 = new Set(arr);console.log(set2);  // {2, 3, 4, 5}

小白:可不可以用数组来操作json呢?
格格:既然已经说了,Set集合是一个类似于数组的东西,就是用来和数组一块玩的,不过偏要往里放json呢,也绝对不含糊

let set1 = new Set();let json1 = {    a: 1,    b: 2};
set1.add(json1);console.log(set1);  // Set(1) {{…}}set1.forEach((item) => {    console.log(item);  // {a: 1, b: 2}});

如果直接在定义里面就写入json的话事会报错的,像这样new Set({1,2}); 只能是用add添加进去,然后再循环出来

格格:由于Set操作json很麻烦,因此有了第二个东西,那就是Map
小白:这个好像在java里面也见过,大学的数据结构里面也有吧

Set集合类似于数组,那么这个Map就类似于json,也可以把这个Map视为其他语言的Map的数据结构,即一组键值对,那么为啥和json不一样呢?有什么区别呢?

由于JavaScript中的键值对的key的命名只能是字符串,其实用其他数据类型比如Number也很合理,那么Map就可以解决这个问题,Map的方法我就不一一举例了,下面我们一块来了:

let map1 = new Map();let json1 = {    a: 1,    b: 2};
map1.set(json1, 3);
map1.set('c', json1);
map1.set('c1', 5);console.log(map1);  // Map(3) {{…} => 3, "c" => {…}, "c1" => 5}console.log(map1.get('c1'));    // 5console.log(map1.has('c')); // truemap1.delete(json1);console.log(map1);  // Map(2) {"c" => {…}, "c1" => 5}

综上所述,Map的所有方法都是通过操作key的,

  • set(key,value):是通过set来设置键值对的

  • get(key):通过get获取key来得到value值
    初次之外呢,循环的用法也是和Set的一模一样:

let map1 = new Map();let json1 = {    a: 1,    b: 2};
map1.set(json1, 3);
map1.set('c', json1);
map1.set('c1', 5);//map1.forEach((val, index) => {  // forEach循环//  console.log(index, val);//});for (let [key, value] of map1) {  // for..of..循环
    console.log(key, value);
}

我的个人理解,Map集合是具备json的所有功能,还多出了命名是任意类型,所以Map就是强化版的json,以后工作中可以常用Set集合和Map集合

关于Set & Map数据结构我们都已经了然于心,以上所有的ESNext的内容都是常用的或者相对重要的

本文的所有内容均是一字一句敲上去的,希望大家阅读完本文可以有所收获,因为能力有限,掌握的知识也是不够全面,欢迎大家提出来一起分享!谢谢O(∩_∩)O~



作者:苏日俪格
链接:https://www.jianshu.com/p/2c8ff58134b0


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP