1、Map

我们知道,在JS中其实对象的方式就跟Java中的Map极为相似,即键值对的方式。JS中,key必须是字符串,实际上Number等值作为key也是合理的,所以为了解决这个问题,在最新的ES6规范中加入了新的数据类型 Map 。
  1. var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
  2. m.get('Michael'); // 95
2
 
1
  1. var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
2
  1. m.get('Michael'); // 95

Map类似二维数组,且每个元素数组的长度为2,其中索引0作为键key,索引1作为值value。所以初始化Map需要一个二维数组,或者直接初始化一个空Map。(常用方法:get获取、set存储、delete删除、has判断包含)
  1. var m = new Map(); // 空Map
  2. m.set('Adam', 67); // 添加新的key-value
  3. m.set('Bob', 59);
  4. m.has('Adam'); // 是否存在key 'Adam' --> true
  5. m.get('Adam'); // 67
  6. m.delete('Adam'); // 删除key 'Adam'
  7. m.get('Adam'); // undefined
7
 
1
  1. var m = new Map(); // 空Map
2
  1. m.set('Adam', 67); // 添加新的key-value
3
  1. m.set('Bob', 59);
4
  1. m.has('Adam'); // 是否存在key 'Adam' --> true
5
  1. m.get('Adam'); // 67
6
  1. m.delete('Adam'); // 删除key 'Adam'
7
  1. m.get('Adam'); // undefined

同样,作为Map,如果多次对同一个key设置不同的value,之前的值会被替换掉。

2、Set

Set和Map类似也是一组key的集合,但是不存储value,且key不能重复。

创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set:
  1. var s1 = new Set(); // 空Set
  2. var s2 = new Set([1, 2, 3]); // 含1, 2, 3
2
 
1
  1. var s1 = new Set(); // 空Set
2
  1. var s2 = new Set([1, 2, 3]); // 含1, 2, 3

重复元素在Set中自动被过滤:
  1. var s = new Set([1, 2, 3, 3, '3']);
  2. s; // Set {1, 2, 3, "3"} --> 注意数字3和字符串'3'是不同的元素
2
 
1
  1. var s = new Set([1, 2, 3, 3, '3']);
2
  1. s; // Set {1, 2, 3, "3"} --> 注意数字3和字符串'3'是不同的元素

通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果;通过delete(key)方法可以删除元素。

可以利用这个特性对数组进行去重:
  1. 'use strict';
  2. // var set = new Set([1,2,1,2,2,1]);
  3. var arr = [1,2,1,2,2,1];
  4. //new Set 数组去重
  5. function unique(arr){
  6. return Array.from(new Set(arr));
  7. };
  8. //使用ES6的方法可以去重.
  9. console.log(unique(arr));
x
 
1
  1. 'use strict';
2
  1. // var set = new Set([1,2,1,2,2,1]);
3
  1.  
4
  1. var arr = [1,2,1,2,2,1];
5
  1.  
6
  1. //new Set 数组去重
7
  1. function unique(arr){
8
  1.  return Array.from(new Set(arr));
9
  1. };
10
  1. //使用ES6的方法可以去重.
11
  1. console.log(unique(arr));

3、iterable

Array可以通过下标循环遍历,但是Map和Set则无法,所以ES6标准引入了新的iterable类型,Array、Map、Set都属于iterable类型。

回顾:对象可以通过 for in 的方式遍历对象所有属性,虽然说实际上Array也是一个对象,但是用 for in 遍历数组会出现问题,具体的可以戳这里,Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果。

所以对于数组,我们还是尽量避免用 for in 的方式,要么老老实实用 for(var i = 0; i < arr.length; i++) 的方式,要么接着往下看:

具有iterable类型的集合,可以通过 for ... of 循环来遍历,直接遍历其元素,而不单纯是索引:
  1. 'use strict';
  2. var a = [1, 2, 3];
  3. for (var x of a) {
  4. alert(x);
  5. }
5
 
1
  1. 'use strict';
2
  1. var a = [1, 2, 3];
3
  1. for (var x of a) {
4
  1. alert(x);
5
  1. }

遍历集合用法如下
  1. var a = ['A', 'B', 'C'];
  2. var s = new Set(['A', 'B', 'C']);
  3. var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
  4. for (var x of a) { // 遍历Array
  5. alert(x);
  6. }
  7. for (var x of s) { // 遍历Set
  8. alert(x);
  9. }
  10. for (var x of m) { // 遍历Map
  11. alert(x[0] + '=' + x[1]);
  12. }
12
 
1
  1. var a = ['A', 'B', 'C'];
2
  1. var s = new Set(['A', 'B', 'C']);
3
  1. var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
4
  1. for (var x of a) { // 遍历Array
5
  1.    alert(x);
6
  1. }
7
  1. for (var x of s) { // 遍历Set
8
  1.    alert(x);
9
  1. }
10
  1. for (var x of m) { // 遍历Map
11
  1.    alert(x[0] + '=' + x[1]);
12
  1. }

还有更好的方式,直接使用 iterable 内置的 forEach 方法,它接收一个函数,每次迭代会自动回调该函数,以Array为例:
  1. var a = ['A', 'B', 'C'];
  2. a.forEach(function(element, index, array){
  3. //element --> 指向当前元素的值
  4. //index --> 指向当前索引
  5. //array --> 指向Array对象本身
  6. alert("element-->"+element);
  7. alert("index-->"+index);
  8. alert("array-->"+array);
  9. });
9
 
1
  1. var a = ['A', 'B', 'C'];
2
  1. a.forEach(function(element, index, array){
3
  1.    //element --> 指向当前元素的值
4
  1.    //index --> 指向当前索引
5
  1.    //array --> 指向Array对象本身
6
  1.    alert("element-->"+element);
7
  1.    alert("index-->"+index);
8
  1.    alert("array-->"+array);
9
  1. });

这里的element、index、array的命名是不固定的,但是固定位置的含义是如上所示的固定的,有一点点类似Java中的方法重载。试一下下面的代码你就明白了:
  1. //Array
  2. var a = ['A', 'B', 'C'];
  3. a.forEach(function(element, index, array){
  4. //element --> 指向当前元素的值
  5. //index --> 指向当前索引
  6. //array --> 指向Array对象本身
  7. alert(element); //首次输出A
  8. alert(element); //首次输出0
  9. alert(element);
  10. });
10
 
1
  1. //Array
2
  1. var a = ['A', 'B', 'C'];
3
  1. a.forEach(function(element, index, array){
4
  1.    //element --> 指向当前元素的值
5
  1.    //index --> 指向当前索引
6
  1.    //array --> 指向Array对象本身
7
  1.    alert(element); //首次输出A
8
  1.    alert(element); //首次输出0
9
  1.    alert(element);
10
  1. });

而Map和Set的话:

  1. //Map
  2. var b = new Map([['indexA', 'a'],['indexB', 'b'],['indexC', 'c']]);
  3. b.forEach(function(value, key, map){
  4. //value --> 指向当前元素的值
  5. //key --> 指向当前键
  6. //map --> 指向Map对象本身
  7. alert(value); //首次输出a
  8. alert(key); //首次输出indexA
  9. alert(map);
  10. });
10
 
1
  1. //Map
2
  1. var b = new Map([['indexA', 'a'],['indexB', 'b'],['indexC', 'c']]);
3
  1. b.forEach(function(value, key, map){
4
  1.    //value --> 指向当前元素的值
5
  1.    //key --> 指向当前键
6
  1.    //map --> 指向Map对象本身
7
  1.    alert(value); //首次输出a
8
  1.    alert(key);  //首次输出indexA
9
  1.    alert(map);
10
  1. });
  1. //Set
  2. var c = new Set(['a', 'b', 'c']);
  3. c.forEach(function(key, key, set){
  4. //key --> 指向当前键
  5. //key --> 指向当前键
  6. //set --> 指向Map对象本身
  7. alert(key); //首次输出a
  8. alert(key); //首次输出a
  9. alert(set);
  10. });
 
1
  1. //Set
2
  1. var c = new Set(['a', 'b', 'c']);
3
  1. c.forEach(function(key, key, set){
4
  1.    //key --> 指向当前键
5
  1.    //key --> 指向当前键
6
  1.    //set --> 指向Map对象本身
7
  1.    alert(key); //首次输出a
8
  1.    alert(key); //首次输出a
9
  1.    alert(set);
10
  1. });

ES6中迭代器部分,更多可以参考:[译]JavaScript ES6迭代器指南

01快速入门-04-Map、Set和iterable(ES6)的更多相关文章

  1. MyBatis 学习总结 01 快速入门

    本文测试源码下载地址: http://onl5wa4sd.bkt.clouddn.com/MyBatis0918.rar 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级 ...

  2. [Android应用开发] 01.快速入门

    前言 这一篇,主要是把之前[安卓基础]系列的东西,做一个总结和补充.并举了两个例子:电话拨号器.短信发送器做巩固,在此也参考了黑马训练营的教学大纲. Android项目的目录结构 Activity:应 ...

  3. AngularJS快速入门指南01:导言

    AngularJS使用新的attributes扩展了HTML AngularJS对单页面应用的支持非常好(SPAs) AngularJS非常容易学习 现在就开始学习AngularJS吧! 关于本指南 ...

  4. 079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象

    079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象 本文知识点:实例化对象 说明:因为时间紧张,本人写博客过程中只是对知 ...

  5. 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构

    004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...

  6. AngularJS快速入门指南04:指令

    AngularJS通过指令将HTML属性进行了扩展. AngularJS指令 AngularJS指令是带有ng-前缀的扩展HTML属性. ng-app指令用来初始化AngularJS applicat ...

  7. Java程序员快速入门Go语言

    这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...

  8. Hadoop生态圈-Hive快速入门篇之HQL的基础语法

    Hadoop生态圈-Hive快速入门篇之HQL的基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的重点是介绍Hive中常见的数据类型,DDL数据定义,DML数据操作 ...

  9. SpringMvc_快速入门,深入分析

    目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...

随机推荐

  1. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(三)一个简单的rtsp播放器

    该篇内容简单的将前两篇内容组合在一起,创建了2个线程,分别播放音频和视频. int main(int argc, char * argv[]) { RtspClient Client; pthread ...

  2. tomcat替换.class文件并没有生效的原因(失效原因)(转)

    紧急关头难免会替换class文件,但一定要注意一下几点. 1.小心class内中的project 的类的后,替换文件需要加上 $classMapper这个类, 编译成class的时候,会把public ...

  3. git/github常用指令、入门

    git的基本常用指令: 1.cd:切换路径 2.mkdir:进入文件夹目录 3.pwd:显示当前目录的路径 4.git init:把当前的目录变成可以管理的git仓库,生成隐藏.git文件 5.git ...

  4. Apache与Tomcat的关系和区别 -个人比较

    我们经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料 ...

  5. MySQL索引1

    索引最大作用就是提高对表中数据的查询速度,就像书的目录那样重要,可以快速查到所需的知识. 上面是11万多条数据的表,使用语句查询,如: 耗时:0.108s 再比如: 用时:0.004s 接下来创建索引 ...

  6. 数据库索引B-树和B+树

    一开始学习数据结构的时候,主要学习的是数组,队列,链表,队列,栈,树这些数据结构,其中树主要学习二叉树,平衡二叉树,二叉搜索树等这些子节点最多只有两个的树结构.但是,当我们接触数据库的时候,你会发现数 ...

  7. ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置

    在 ASP.NET Core 里扩展 Razor 查找视图目录不是什么新鲜和困难的事情,但 _ViewStart 和 _ViewImports 这2个视图比较特殊,如果想让 Razor 在我们指定的目 ...

  8. POI 自用API

    poi包下载 API 使用POI生成Excel,大家都是赞个.可是狐狸觉得毕竟不是微软的产品,使用没有C#语言的好用,方法还是存在极限的. 下面总结狐狸自己用过的方法: import org.apac ...

  9. 零基础如何一步一步开始搭建高性能直播平台?现以GitChat·架构来进行说明

    前言 现在直播已经成为移动互联网时代一个新的重要流量入口,从YY.斗鱼到花椒直播,直播已经成为人们分享交流的新方式,应用场景众多,主要分为: 金融类直播:金融直播可应用于实时解盘,在线专家讲座,专家在 ...

  10. Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案

    Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案 网上太多相关资料,但是抄袭严重,有的讲的也是之言片语的,根本不连贯(可能知道的人确实不想多说) 我总共 ...