一文搞懂ES6中的Map和Set


Posted in Javascript onMay 20, 2019

Map

Map对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。构造函数Map可以接受一个数组作为参数。

Map和Object的区别

•一个Object 的键只能是字符串或者 Symbols,但一个Map 的键可以是任意值。

•Map中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。

•Map的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。

•Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

1.Map对象的属性

•size:返回Map对象中所包含的键值对个数

1.Map对象的方法

•set(key, val): 向Map中添加新元素

•get(key): 通过键值查找特定的数值并返回

•has(key): 判断Map对象中是否有Key所对应的值,有返回true,否则返回false

•delete(key): 通过键值从Map中移除对应的数据

•clear(): 将这个Map中的所有元素删除

const m1 = new Map([['a', 111], ['b', 222]])
console.log(m1) // {"a" => 111, "b" => 222}
m1.get('a') // 111
const m2 = new Map([['c', 3]])
const m3 = new Map(m2)
m3.get('c') // 3
m3.has('c') // true
m3.set('d', 555)
m3.get('d') // 555

1.遍历方法

•keys():返回键名的遍历器

•values():返回键值的遍历器

•entries():返回键值对的遍历器

•forEach():使用回调函数遍历每个成员

const map = new Map([['a', 1], ['b', 2]])

for (let key of map.keys()) {
 console.log(key)
}
// "a"
// "b"

for (let value of map.values()) {
 console.log(value)
}
// 1
// 2

for (let item of map.entries()) {
 console.log(item)
}
// ["a", 1]
// ["b", 2]

// 或者
for (let [key, value] of map.entries()) {
 console.log(key, value)
}
// "a" 1
// "b" 2
// for...of...遍历map等同于使用map.entries()
for (let [key, value] of map) {
 console.log(key, value)
}
// "a" 1
// "b" 2

1.map与其他数据结构的互相转换

•map转换为数组(使用扩展运算符)

const arr = [[{'a': 1}, 111], ['b': 222]]

const myMap = new Map(arr)

[...myMap] // map转数组。 [[{'a': 1}, 111], ['b': 222]]
•Map与对象的互换
const obj = {}
const map = new Map(['a', 111], ['b', 222])
for(let [key,value] of map) {
 obj[key] = value
}
console.log(obj) // {a:111, b: 222}

•JSON字符串要转换成Map可以先利用JSON.parse()转换成数组或者对象,然后再转换即可。

Set

Set对象允许你存储任何类型的值,无论是原始值或者是对象引用。它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set 本身是一个构造函数,用来生成Set 数据结构。Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

Set中的特殊值

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:

•+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复

•undefined 与 undefined 是恒等的,所以不重复

•NaN 与 NaN 是不恒等的,但是在 Set 中认为NaN与NaN相等,所有只能存在一个,不重复。

1.Set实例对象的属性

•size:返回Set实例的成员总数。

1.Set实例对象的方法

•add(value):添加某个值,返回 Set 结构本身(可以链式调用)。

•delete(value):删除某个值,删除成功返回true,否则返回false。

•has(value):返回一个布尔值,表示该值是否为Set的成员。

•clear():清除所有成员,没有返回值。

const mySet = new Set(['a', 'a', 'b', 1, 2, 1])
console.log(mySet) // {'a', 'b', 1, 2}
myset.add('c').add({'a': 1})
console.log(mySet) // {'a', 'b', 1, 2, 'c', {a: 1}}
console.log(mySet.size) // 6
mySet.has(2) // true

1.遍历方法

•keys():返回键名的遍历器。

•values():返回键值的遍历器。
•entries():返回键值对的遍历器。

•forEach():使用回调函数遍历每个成员。

由于Set结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。

const set = new Set(['a', 'b', 'c'])
for (let item of set.keys()) {
 console.log(item)
}
// a
// b
// c
for (let item of set.values()) {
 console.log(item)
}
// a
// b
// c
for (let item of set.entries()) {
 console.log(item)
}
// ["a", "a"]
// ["b", "b"]
// ["c", "c"]
// 直接遍历set实例,等同于遍历set实例的values方法
for (let i of set) {
 console.log(i)
}
// a
// b
// c
set.forEach((value, key) => console.log(key + ' : ' + value))
// a: a
// b: b
// c: c

1.Set 对象作用

•数组去重(利用扩展运算符)

const mySet = new Set([1, 2, 3, 4, 4])
[...mySet] // [1, 2, 3, 4]

•合并两个set对象

let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let union = new Set([...a, ...b]) // {1, 2, 3, 4}

•交集

let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let intersect = new Set([...a].filter(x => b.has(x))) // {2, 3} 利用数组的filter方法

•差集

let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let difference = new Set([...a].filter(x => !b.has(x))) // {1}

总结

以上所述是小编给大家介绍的一文搞懂ES6中的Map和Set,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery.cvtooltip.js 基于jquery的气泡提示插件
Nov 19 Javascript
jQuery中读取json文件示例代码
May 10 Javascript
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
May 03 Javascript
jQuery Ajax页面局部加载方法汇总
Jun 02 Javascript
JS模拟实现ECMAScript5新增的数组方法
Mar 20 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
Angular中ng-options下拉数据默认值的设定方法
Jun 21 Javascript
js+html5实现页面可刷新的倒计时效果
Jul 15 Javascript
基于DOM节点删除之empty和remove的区别(详解)
Sep 11 Javascript
Vue学习之axios的使用方法实例分析
Jan 06 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 Javascript
详解vue 在移动端体验上的优化解决方案
May 20 #Javascript
vue-i18n结合Element-ui的配置方法
May 20 #Javascript
JS实现选项卡效果的代码实例
May 20 #Javascript
微信打开网址添加在浏览器中打开提示的办法
May 20 #Javascript
浅谈Vuex注入Vue生命周期的过程
May 20 #Javascript
微信小程序图表插件wx-charts用法实例详解
May 20 #Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 #Javascript
You might like
在PHP中使用模板的方法
2008/05/24 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
vue实现下拉菜单树
2020/10/22 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
获取Django项目的全部url方法详解
2017/10/26 Python
Python返回数组/List长度的实例
2018/06/23 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
如何查找和删除数据库中的重复数据
2014/11/05 面试题
财务会计专业应届毕业生求职信
2013/10/18 职场文书
小松树教学反思
2014/02/11 职场文书
2014年英语工作总结
2014/12/20 职场文书
永远是春天观后感
2015/06/12 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python
详解python网络进程
2021/06/15 Python
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers