本文是 重温基础 系列文章的第十一篇。

今日感受:注意身体,生病花钱又难受。

系列目录:

本章节复习的是JS中的Map和Set对象,是个集合。

前置知识:

Map和Set对象是在ES6中被引入的,作为一种由key值标记的数据容器。

Map和Set对象承载的数据元素可以按照插入时的顺序,被迭代遍历。

1 Set对象

介绍:

Set数据结构类似数组,但所有成员的值唯一

Set本身为一个构造函数,用来生成Set数据结构,使用add方法来添加新成员。

  1. let a = new Set();
  2. [1,2,2,1,3,4,5,4,5].forEach(x=>a.add(x));
  3. for(let k of a){
  4. console.log(k)
  5. };
  6. // 1 2 3 4 5

基础使用

  1. let a = new Set([1,2,3,3,4]);
  2. [...a]; // [1,2,3,4]
  3. a.size; // 4
  4. // 数组去重
  5. [...new Set([1,2,3,4,4,4])];// [1,2,3,4]

注意

  • Set中添加值的时候,不会类型转换,即5'5'是不同的。
  1. [...new Set([5,'5'])]; // [5, "5"]

属性和方法

  • 属性:

    • Set.prototype.constructor:构造函数,默认就是Set函数。
    • Set.prototype.size:返回Set实例的成员总数。
  • 操作方法:

    • add(value):添加某个值,返回 Set 结构本身。
    • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
    • has(value):返回一个布尔值,表示该值是否为Set的成员。
    • clear():清除所有成员,没有返回值。
  1. let a = new Set();
  2. a.add(1).add(2); // a => Set(2) {1, 2}
  3. a.has(2); // true
  4. a.has(3); // false
  5. a.delete(2); // true a => Set(1) {1}
  6. a.clear(); // a => Set(0) {}

数组去重

  1. let a = new Set([1,2,3,3,3,3]);

2 Set的应用

数组去重

  1. // 方法1
  2. [...new Set([1,2,3,4,4,4])]; // [1,2,3,4]
  3. // 方法2
  4. Array.from(new Set([1,2,3,4,4,4])); // [1,2,3,4]

遍历和过滤

  1. let a = new Set([1,2,3,4]);
  2. // map 遍历操作
  3. let b = new Set([...a].map(x =>x*2));// b => Set(4) {2,4,6,8}
  4. // filter 过滤操作
  5. let c = new Set([...a].filter(x =>(x%2) == 0)); // b => Set(2) {2,4}

获取并集、交集和差集

  1. let a = new Set([1,2,3]);
  2. let b = new Set([4,3,2]);
  3. // 并集
  4. let c1 = new Set([...a, ...b]); // Set {1,2,3,4}
  5. // 交集
  6. let c2 = new Set([...a].filter(x => b.has(x))); // set {2,3}
  7. // 差集
  8. let c3 = new Set([...a].filter(x => !b.has(x))); // set {1}
  • 遍历方法:

    • keys():返回键名的遍历器。
    • values():返回键值的遍历器。
    • entries():返回键值对的遍历器。
    • forEach():使用回调函数遍历每个成员

Set遍历顺序是插入顺序,当保存多个回调函数,只需按照顺序调用。但由于Set结构没有键名只有键值,所以keys()values()是返回结果相同。

  1. let a = new Set(['a','b','c']);
  2. for(let i of a.keys()){console.log(i)}; // 'a' 'b' 'c'
  3. for(let i of a.values()){console.log(i)}; // 'a' 'b' 'c'
  4. for(let i of a.entries()){console.log(i)};
  5. // ['a','a'] ['b','b'] ['c','c']

并且 还可以使用for...of直接遍历Set

  1. let a = new Set(['a','b','c']);
  2. for(let k of a){console.log(k)}; // 'a' 'b' 'c'

forEach与数组相同,对每个成员执行操作,且无返回值。

  1. let a = new Set(['a','b','c']);
  2. a.forEach((v,k) => console.log(k + ' : ' + v));

3 Map对象

由于传统的JavaScript对象只能用字符串当做键,给开发带来很大限制,ES6增加Map数据结构,使得各种类型的值(包括对象)都可以作为键。

Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。

基础使用

  1. let a = new Map();
  2. let b = {name: 'leo' };
  3. a.set(b,'my name'); // 添加值
  4. a.get(b); // 获取值
  5. a.size; // 获取总数
  6. a.has(b); // 查询是否存在
  7. a.delete(b); // 删除一个值
  8. a.clear(); // 清空所有成员 无返回

注意

  • 传入数组作为参数,指定键值对的数组
  1. let a = new Map([
  2. ['name','leo'],
  3. ['age',18]
  4. ])
  • 如果对同一个键多次赋值,后面的值将覆盖前面的值
  1. let a = new Map();
  2. a.set(1,'aaa').set(1,'bbb');
  3. a.get(1); // 'bbb'
  • 如果读取一个未知的键,则返回undefined
  1. new Map().get('abcdef'); // undefined
  • 同样的值的两个实例,在 Map 结构中被视为两个键。
  1. let a = new Map();
  2. let a1 = ['aaa'];
  3. let a2 = ['aaa'];
  4. a.set(a1,111).set(a2,222);
  5. a.get(a1); // 111
  6. a.get(a2); // 222

遍历方法

Map 的遍历顺序就是插入顺序。

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历 Map 的所有成员。
  1. let a = new Map([
  2. ['name','leo'],
  3. ['age',18]
  4. ])
  5. for (let i of a.keys()){...};
  6. for (let i of a.values()){...};
  7. for (let i of a.entries()){...};
  8. a.forEach((v,k,m)=>{
  9. console.log(`key:${k},value:${v},map:${m}`)
  10. })

将Map结构转成数组结构

  1. let a = new Map([
  2. ['name','leo'],
  3. ['age',18]
  4. ])
  5. let a1 = [...a.keys()]; // a1 => ["name", "age"]
  6. let a2 = [...a.values()]; // a2 => ["leo", 18]
  7. let a3 = [...a.entries()];// a3 => [['name','leo'], ['age',18]]

4 Map与其他数据结构互相转换

  • Map 转 数组
  1. let a = new Map().set(true,1).set({f:2},['abc']);
  2. [...a]; // [[true:1], [ {f:2},['abc'] ]]
  • 数组 转 Map
  1. let a = [ ['name','leo'], [1, 'hi' ]]
  2. let b = new Map(a);
  • Map 转 对象

    如果所有 Map 的键都是字符串,它可以无损地转为对象。

    如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。
  1. function fun(s) {
  2. let obj = Object.create(null);
  3. for (let [k,v] of s) {
  4. obj[k] = v;
  5. }
  6. return obj;
  7. }
  8. const a = new Map().set('yes', true).set('no', false);
  9. fun(a)
  10. // { yes: true, no: false }
  • 对象 转 Map
  1. function fun(obj) {
  2. let a = new Map();
  3. for (let k of Object.keys(obj)) {
  4. a.set(k, obj[k]);
  5. }
  6. return a;
  7. }
  8. fun({yes: true, no: false})
  9. // Map {"yes" => true, "no" => false}
  • Map 转 JSON

    (1)Map键名都是字符串,转为对象JSON:
  1. function fun (s) {
  2. let obj = Object.create(null);
  3. for (let [k,v] of s) {
  4. obj[k] = v;
  5. }
  6. return JSON.stringify(obj)
  7. }
  8. let a = new Map().set('yes', true).set('no', false);
  9. fun(a);
  10. // '{"yes":true,"no":false}'

(2)Map键名有非字符串,转为数组JSON:

  1. function fun (map) {
  2. return JSON.stringify([...map]);
  3. }
  4. let a = new Map().set(true, 7).set({foo: 3}, ['abc']);
  5. fun(a)
  6. // '[[true,7],[{"foo":3},["abc"]]]'
  • JSON 转 Map

    (1)所有键名都是字符串:
  1. function fun (s) {
  2. let strMap = new Map();
  3. for (let k of Object.keys(s)) {
  4. strMap.set(k, s[k]);
  5. }
  6. return strMap;
  7. return JSON.parse(strMap);
  8. }
  9. fun('{"yes": true, "no": false}')
  10. // Map {'yes' => true, 'no' => false}

(2)整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组:

  1. function fun2(s) {
  2. return new Map(JSON.parse(s));
  3. }
  4. fun2('[[true,7],[{"foo":3},["abc"]]]')
  5. // Map {true => 7, Object {foo: 3} => ['abc']}

参考资料

1.阮一峰ES6入门


本部分内容到这结束

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推荐 https://github.com/pingan8787/Leo_Reading/issues
JS小册 js.pingan8787.com

【重温基础】11.Map和Set对象的更多相关文章

  1. 【重温基础】15.JS对象介绍

    从这篇文章开始,复习 MDN 中级教程 的内容了,在初级教程中,我和大家分享了一些比较简单基础的知识点,并放在我的 [Cute-JavaScript]系列文章中. 关于[Cute-JavaScript ...

  2. 【重温基础】16.JSON对象介绍

    本文是 重温基础 系列文章的第十六篇. 今日感受:静. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 本章节复习的 ...

  3. GO学习-(11) Go语言基础之map

    Go语言基础之map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能 ...

  4. Map拷贝 关于对象深拷贝 浅拷贝的问题

    问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后      先看例子:     ...

  5. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  6. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】

    什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来读取数据,进行内容的 ...

  7. 工作随笔—Java容器基础知识分享(持有对象)

    1. 概述 通常,程序总是运行时才知道的根据某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型,为解决这个普遍的编程问题:需要在任意时刻和任意位置创建任意数量的对象,所以,就 ...

  8. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  9. 转:EL表达式的11个内置对象

    原文地址:https://blog.csdn.net/qq_17045385/article/details/54799998 EL是JSP内置的表达式语言 JSP2.0开始,不让再使用Java脚本, ...

随机推荐

  1. lqb 基础练习 十六进制转八进制 (字符串进行进制转化)

    基础练习 十六进制转八进制 时间限制:1.0s   内存限制:512.0MB     问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n ...

  2. hdu 1556 Color the ball (树状数组)

    Color the ballTime Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. 1 数据 & 图表

    瞎逼逼:虽然是统计专业,但学艺不精.大学受过的专业训练很少,妥妥学渣.因此工作后决定重新复习,阅读材料为贾俊平的<统计学>第7版.每周更新. 我不按照书里的逻辑顺序和所有知识点来写我的笔记 ...

  4. Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)

    Condition对象 一).Condition的定义 Condition对象:与锁关联,协调多线程间的复杂协作. 获取与锁绑定的Condition对象: Lock lock = new Reentr ...

  5. MySQL索引长度限制

    索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...

  6. 20191121-7 Scrum立会报告+燃尽图 03

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/10067一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  7. LoadRunner 录制问题集锦

    关键词:各路录制小白汇集于此 虽然知道君对录制不感冒,但总是看到扎堆的人说这些问题,忍不住要站出来了. 百度虽好,帮助了很多小白,但关键是百度并没有排除错误内容,经过历史的几年传播,错的都快变对的了, ...

  8. 2019-9-17:渗透测试,基础学习,apache初识,mysql初识等笔记

    python -m SimpleHTTPServer gedit 文本编辑器 apache2 默认配置文件目录:/etc/apache2/apache2默认首页源码: /var/www/html my ...

  9. win上找到host文件的方法

    在运行的位置输入 C:\WINDOWS\system32\drivers\etc

  10. 【Android - IPC】之Serializable和Parcelable序列化

    1.序列化的目的 (1)永久的保存对象数据(将对象数据保存到文件或磁盘中): (2)通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的,因此序列化的目的是将对象数据 ...