深入理解ES6之—set与map
Set是无重复值的有序列表。Set会自动移除重复的值,因此你可以使用它来过滤数组中重复的值并返回结果。
Map是有序的键值对,其中的键允许是任何类型。
Set和Map是es6新增的两个数据集合。
Set集合
es6新增了set类型,这是一种无重复值的有序列表。Set允许对它包含的数据进行快速访问。
创建Set并添加项目
Set通过new Set()来创建,调用add()方法就可以向Set中添加项目。检查size属性还能查看其中包含多少项。
let set = new Set();
set.add(5);
set.add("5");
console.log(set.size);//2
Set不会使用强制类型转换来判断值是否重复。还可以向Set添加多个对象,他们不会被合并为同一项。
let set = new Set();
let key1 = {};
let key2 = {};
set.add(key1);
set.add(key2);
console.log(set.size);//2
如果add()方法用相同的值进行了多次调用,那么在第一次之后的调用实际上会被忽略。
let set = new Set();
set.add(5);
set.add("5");
set.add(5);//被忽略
console.log(set.size);//2
你可以使用数组来初始化一个Set,并且Set构造器确保不会重复使用这些值。
let set = new Set([1,2,3,4,5,2,6,5,5,5]);
console.log(set.size);//6
虽然数值5在数组中出现了四次,但是Set中只有一个5
你可以使用has()方法来测试某个值是否存在于set中
let set = new Set();
let key1 = {};
let key2 = {};
let key3 = {};
set.add(key1);
set.add(key2);
console.log(set.has(key1));//true
console.log(set.has(key3));//false
移除值
使用delete()方法来移除单个值或者调用clear()方法将所有值从Set中移除。
let set = new Set([1, 2, 3, 4, 5, 2, 6, 5, 5, "5"]);
console.log(set);
set.delete(5);
console.log(set.has(5));//false
set.clear();
console.log(set.size);//0
Set 上的forEach()方法
forEach()方法还会被传递一个回调函数,该回调函数接收三个参数:
- Set中下个位置的值
- 与第一个参数相同的值
- 目标Set本身
由于Set没有键,为了使forEach方法与数组和map的forEach方法一致:将Set中的每一项同时认定为键与值。
let set = new Set([1, 2]);
set.forEach(function(value, key, ownerSet) {
console.log(`${key} ${value}`)
console.log(ownerSet === set);
})
将Set转换为数组
let arr = [1,2,4,3,2,5,5];
let set = new Set(arr);
let arr1 = [...set];
console.log(arr1);
Map集合
ES6的Map类型是键值对的有序列表,而键和值都可以是任意类型。键的比较使用的是Object.is(),因此你可以将5与“5”同时作为键,因为他们类型不同。
可以调用set方法并传递一个键与一个关联的值,来给Map添加项;此后使用键名来调用get()方法便能提取对应的值。
let map = new Map();
map.set("name", "cc");
map.set("age", 23);
console.log(map.get("name"));//cc
console.log(map.get("age"));//23
也可以使用对象作为键
let map = new Map();
let key1 = {};
let key2 = {};
map.set(key1, 5);
map.set(key2, 8);
console.log(map.get(key1));//5
console.log(map.get(key2));//8
Map的方法和属性
- has(key)
- delete(key)
- clear()
- size
Map的初始化
你能将数组传递给Map构造器,以便使用数据来初始化一个Map。该数组中的每一项也必须是数组,内部数组的首个项会作为键,第二项则为对应值。因此整个Map就被这些双项数组填充。
let map = new Map([
["name", "cc"],
["age", 26]
]);
console.log(map.has("name"));//true
console.log(map.get("name"));//cc
console.log(map.has("age"));//true
console.log(map.get("age"));//26
console.log(map.size);//2
Map上的forEach()方法
let map = new Map([
["name", "cc"],
["age", 26]
]);
map.forEach(function(value, key, source) {
console.log(`${key}的值是${value}`);
console.log(source === map);
})
深入理解ES6之—set与map的更多相关文章
- 理解Golang哈希表Map的元素
目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...
- 理解 ES6 Generator-next()方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 前端笔记之React(六)ES6的Set和Map&immutable和Ramda和lodash&redux-thunk
一.ES6的Set.Map数据结构 Map.Set都是ES6新的数据结构,都是新的内置构造函数,也就是说typeof的结果,多了两个: Set 是不能重复的数组 Map 是可以任何东西当做键的对象 E ...
- 前端知识体系:JavaScript基础-原型和原型链-理解 es6 中class构造以及继承的底层实现原理
理解 es6 中class构造以及继承的底层实现原理 原文链接:https://blog.csdn.net/qq_34149805/article/details/86105123 1.ES6 cla ...
- 【读书笔记】【深入理解ES6】#7-Set集合和Map集合
ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...
- ES6之Set与Map加深理解
Set 类似于数组,但是成员的值都是唯一的,没有重复的值,有序. Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化. 用途 数组去重: [...new ...
- 深入理解es6(下)
一.symbol javascript基本数据类型: null.undefined.number.boolean.string.symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无 ...
- 深入理解ES6(二)(解构赋值)
变量的解构赋值 (1) 数组的解构赋值 1.基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring ). 只要等号两边的模式相同,左边的变量 ...
- es6之set和map
1.set ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值,set本身就是构造函数,所以可以通过new的方式来创建对象 // 例一 可以做数组去重用 var set ...
随机推荐
- JS数字金额转换为货币汉字形式
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- Java伪代码描述《大道至简》第一章
第一节 Begin //原始需求 惩山北之塞,出入之迂 //项目沟通的基本方式 聚室而谋曰 //项目目标 毕力平险,指通豫南,达于汉阴 //技术方案 扣石垦壤,箕畚运于渤海之尾 //技术人员和工程管理 ...
- Google赛马分析
原题 想必田忌赛马的故事,大家都耳熟能详.但是,大家知道Goolge的童鞋们是怎么赛马的么?不过,首先,大家要先尝试一下:有25匹马,每次只能五匹一起跑,那么最少跑几次,才能确定前三甲呢? 分析 这样 ...
- Vim的基本使用(二)
本文为原创文章,转载请标明出处 目录 11.可视模式 12.指定计数 13.重复命令 14.外部命令 15.命令行编辑 16.文件编辑 17.分割窗口 18.GUI命令 19.配置 20.Vim Ch ...
- django集成celery之callback方式link_error和on_failure
在使用django集成celery进行了异步调度任务之后,如果想对失败的任务进行跟踪或者告警,怎么做? 这里提供一个亲测的方法. 1.任务callback 假如你想在任务执行失败的时候,打印错误信息并 ...
- JAVA基础总结2
2.1 关键字 常用的关键字主要包括如下: 2.2 标识符 简单而言标识符它其实就是用于标识某些东西的符号. 2.3 注释的应用 注释说明 注释的作用: 注释的应用: 2.4 常量和变量 常量的定义与 ...
- db2备份还原
还原步骤:创建好数据库后进入该数据库 .restore db TSMESDB from D:\ICSS\dbData on D:\ICSS\dbData into TSMESDB redirect. ...
- 点击jsp页面上的超链接后怎么找到对应的servlet
首先超链接是一个像是url一部分的东西,其实不追求深入的道理可以联想到web.xml中的一个<url-pattern>,其实它俩也的确是对应关系,然后<url-pattern> ...
- 一天工作所用到的Git命令
一天工作所用到的Git命令 像大多数新手一样,我一开始是在网上搜索 Git 命令,然后把答案复制粘贴,并没有真正理解它们究竟做了什么. 后来我曾经想过:"如果有一个最常见的 Git 命令的列 ...
- 设计模式:基于线程池的并发Visitor模式
1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...