最新要闻
- 天天百事通!今日成都到康定怎么坐车_成都到康定
- 亮机卡也有春天 锐龙7000核显超频到3.1GHz 游戏性能猛增40%
- 当前要闻:困扰十几亿人!脚趾甲咋会向肉里长?
- 世界焦点!TCL发布超薄四开门冰箱T9:0cm无缝式嵌入 456L仅3399元
- 增程、换电、800V高压快充 谁才是未来新能源车最佳补能方式?
- 环球新动态:发3000元却收回2800元!“慈善主播”被行拘 账号被封
- 【焦点热闻】秘而不宣的读法
- 世界热门:RTX 4070 Laptop逆天能效比!七彩虹将星X15 AT 2023游戏本首发评测
- 全球快看:1月豪华车销量榜:蔚来碾压全系合资二线豪华品牌
- 被网友玩坏?微软Bing的ChatGPT被证实变愚蠢了
- 每日消息!“张伟”骗取数位宝马车主百万购车款 4S店疯狂推卸责任?
- AMD锐龙7 7735HS迷你机也有“青春版”:只变了两个USB接口
- 环球今头条!攒台白色的MATX主机,在B760主板上也能玩好内存超频
- 当前热门:用送的那块布擦镜片:小心眼镜被废!
- 观热点:60岁快递员意外猝死 快递公司回应:深感痛心 善后已达成一致
- 女子连刷10个差评商家找上门:不好吃你天天来干嘛 谁生活容易啊
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Map数据结构详解
Map
Object
本质上是键值对的集合(Hash结构),但Object
只能将字符串当做键,这就给Object
带来了很大的限制。
(资料图片)
let data = {}let s = { name : "东方不败" }data[s] = "西方求败"// 如果键传入非字符串的值,会自动为字符串console.log(data); // {[object Object]: "西方求败"}console.log(data["[object Object]"]); // 西方求败
为了解决这个问题,es6
提供了Map
数据结构。它类似于对象,也是键值对集合,但键不局限于字符串
,各种类型的值都可以当做键。
- Object结构:
字符串键:值
- Map结构:
值键:值
let data2 = new Map()let s2 = { name : "艺术概论"}data2.set(s2,"中国工艺美术史")console.log(data2.get(s2)); // 中国工艺美术史console.log(data2); // key: {name: "艺术概论"} , value : "中国工艺美术史"
上面案例使用Map
的set
方法,将s2
当做data2
的键,使用get
方法取值。
Map的一些常用方法
方法 | 说明 |
---|---|
set() | 为Map对象添加一个指定键(key)和值(value)的新元素 |
get() | 用来获取Map对象中指定的元素 |
has() | 返回boolean值,用来表明Map中是否存在该元素 |
delete() | 删除对应元素 |
size | 返回Map的成员数 |
clear() | 清除Map所有成员,没有返回值 |
let data2 = new Map()let s2 = { name : "艺术概论" }data2.set(s2,"中国工艺美术史")data2.size; // 1data2.has(s2); // treudata2.delete(s2); // truedata2.has(s2); // falsedata2.clear(); // undefined
Map参数
Map
可以接收数组作为参数,数组的成员是单个单个
的键值对的数组
let map = new Map([ ["name","东方不败"], ["title","西方求败"]])console.log(map.size); // 2console.log(map); // {"name" => "东方不败"}, {"title" => "西方求败"}console.log(map.has("name")); // trueconsole.log(map.get("name")); // 东方不败
注意:如果有多个相同的键,后面的键值会覆盖前面的键值
不仅是数组,任何具有Iterator
接口、且每个成员都是一个双元素的数组
的数据结构,都可以当做Map
构造函数的参数,Set
和Map
也可以用来生成新的Map
Set作为参数
let set = new Set([["a",1],["b",2]])let m = new Map(set)console.log(m); // {"a" => 1, "b" => 2}console.log(m.get("a")); // 1
Map作为参数
let map2 = new Map([["text","世界现代设计史"],["name","王受之"]])let m2 = new Map(map2)console.log(m2); // {"text" => "世界现代设计史", "name" => "王受之"}console.log(m2.get("text")); // 世界现代设计史console.log(m2.get("hello")); // 读取不存在的键会返回undefined
Map
只有对同一个对象的引用才视为同一个键
let map3 = new Map()map3.set(["a",100])console.log(map3.get(["a"])); // undefined
因为数组不是引用类型,生成多个数组,它们的内存地址是不一样的,其实就是基础数据类型和引用数据类型的应用,这里的两个["a"]
看似是一样的,其实它们根本就是两个不同的值,Map
只有对同一个对象的引用才视为同一个键,没有读取到所以返回undefined
。请看下面的例子
let map4 = new Map()let b = ["b"]let b2 = ["b"]map4.set(b)console.log(map4.get(b2)); // undefined
Map
的值其实是跟内存地址绑定的,内存地址不同,那么键就不同(即使名字一模一样),在这里Map
就解决了同名属性冲突的问题,当我们使用别人的库时,使用对象名当做键,就不同担心自己的属性与别人的属性相同了。
如果Map
的键是一个简单数据类型的值,如:number、string、boolean
,只要这两个值严格相等,Map
就视为同一个键,例如:0
和-0
就是同一个键,而布尔值true
和字符串true
就是不同的键,此外null
和undefined
也是不同的键。NaN
视为同一个键。
let n = new Map()n.set(0,100)console.log(n.get(-0)); // 100n.set(5,123)console.log(n.get("5")); // undefinedn.set(true,100)console.log(n.get(1)); // undefinedn.set(NaN,123)console.log(n.get(NaN)); // 123n.set(null,100)console.log(n.get(null)); // 100console.log(n.get(undefined)); // undefined
Map遍历方法
Map
提供三个遍历器生成函数和一个遍历方法
方法 | 说明 |
---|---|
Map.prototype.keys() | 返回键名的遍历器。 |
Map.prototype.values() | 返回键值的遍历器。 |
Map.prototype.entries() | 返回所有成员的遍历器。 |
Map.prototype.forEach() | 遍历 Map 的所有成员。 |
定义数据
let m3 = new Map([ ["a",100], ["b",200], ["c",300]])
keys
/* keys */for(let k of m3.keys()){ console.log(k); // a b c}
values
/* values */for(let k of m3.values()){ console.log(k); // 100 200 300}
entries
for(let k of m3.entries()){ console.log(k); // ["a", 100] ["b", 200] ["c", 300] console.log(k[0],k[1]); // a 100 b 200 c 300}// 或for(let [k,v] of m3.entries()){ console.log(k,v); // a 100 b 200 c 300}
forEach
m3.forEach(el => console.log(el)) // 100 200 300m3.forEach((val,index) => console.log(val,index)) // 100 "a" 200 "b" 300 "c"
Map数据结构转换
Map转数组
使用扩展运算符将Map
结构转换为数组
let a = new Map([ ["a",1], ["b",2], ["c",3]])console.log([...a.keys()]); // ["a","b","c"]console.log([...a.values()]); // [1,2,3]console.log([...a.entries()]); // ["a", 1] ["b", 2] ["c", 3]console.log([...a]); // ["a", 1] ["b", 2] ["c", 3]
转换后的数组是一个真正的数组,可以使用数组方法
let back = [...a].filter((val,index) => val[1] == 2 )console.log(back); // ["b",2]
数组转Map
let a2 = new Map([ ["name","东方不败"], [{num : 3},["abc"]]])console.log(a2); // 0: {"name" => "东方不败"} 1: {Object => Array(1)}
Map转对象
let a3 = new Map().set("a",100).set("b",200)/* 通过函数传入map */function mapToObj(mapVal){// 在内部创建一个空对象let obj = {}// 遍历map结构,给空对象赋值for([k,v] of mapVal){ obj[k] = v } return obj}let mObj = mapToObj(a3)console.log(mObj); // {a: 100, b: 200}
如果有非字符串键名,会被转换成字符串再创建对象键名
对象转Map
let obj = {"a":123,"b":456} let mObj2 = new Map(Object.entries(obj)) console.log(mObj2); // {"a" => 123, "b" => 456}
Map转JSON
Map转JSON需要区分两种情况1、Map键名都是字符串2、Map键名有非字符串的情况
1、Map键名都是字符串可以写一个通用函数,用来将Map转为JSON
let j = new Map().set("name","东方").set("text","不败")// mapToObj为上面创建的Map转对象的函数let shiftStrJson = (mapVal) => JSON.stringify(mapToObj(mapVal))console.log(shiftStrJson(j)); // "{"name":"东方","text":"不败"}"
2、Map键名有非字符串的情况
function shiftMaptoArrayJson(mapVal){ return JSON.stringify([...mapVal])}let j2 = new Map().set("name","东方").set("text","不败")let shiftStrJson2 = shiftMaptoArrayJson(j2)console.log(shiftStrJson2); // "[["name","东方"],["text","不败"]]"
以上两种的转换结果:
JSON转Map
JSON转Map需要区分两种情况1、Map键名都是字符串2、Map键名有非字符串的情况
1、键名都是字符串
let strObj = "{"name":"东方","text":"不败"}"let strMap = new Map(Object.entries(JSON.parse(strObj)))console.log(strMap); // {"name" => "东方", "text" => "不败"}
2、键名有非字符串情况
let strObj2 = "[["name","东方"],["text","不败"]]"let strMap2 = new Map(JSON.parse(strObj2))console.log(strMap2); // {"name" => "东方", "text" => "不败"}
案例源码:https://gitee.com/wang_fan_w/es6-science-institute
如果觉得这篇文章对你有帮助,欢迎点亮一下star哟
-
环球视讯!在PHP和JavaScript中设置Cookie、会话存储(SessionStorage)和本地存储(LocalStorage)
A Cookie介绍Cookie:Cookie常用于识别用户,它是服务器留在用户计算机中的小文件(大小限制在4KB),...
来源: Map数据结构详解
环球视讯!在PHP和JavaScript中设置Cookie、会话存储(SessionStorage)和本地存储(LocalStorage)
天天百事通!今日成都到康定怎么坐车_成都到康定
亮机卡也有春天 锐龙7000核显超频到3.1GHz 游戏性能猛增40%
当前要闻:困扰十几亿人!脚趾甲咋会向肉里长?
世界焦点!TCL发布超薄四开门冰箱T9:0cm无缝式嵌入 456L仅3399元
增程、换电、800V高压快充 谁才是未来新能源车最佳补能方式?
环球新动态:发3000元却收回2800元!“慈善主播”被行拘 账号被封
【焦点热闻】秘而不宣的读法
C#的string是一种糟糕的设计吗?
当前视讯!队列——queue的用法(及洛谷B3616)
vue-cli安装依赖 props属性三种方式 混入迷信 插件 elementUI vuex vue Routerd localStorage系列
openfoam文件读取
fusion app自定义事件源码介绍(上)
世界热门:RTX 4070 Laptop逆天能效比!七彩虹将星X15 AT 2023游戏本首发评测
全球快看:1月豪华车销量榜:蔚来碾压全系合资二线豪华品牌
被网友玩坏?微软Bing的ChatGPT被证实变愚蠢了
每日消息!“张伟”骗取数位宝马车主百万购车款 4S店疯狂推卸责任?
AMD锐龙7 7735HS迷你机也有“青春版”:只变了两个USB接口
环球今头条!攒台白色的MATX主机,在B760主板上也能玩好内存超频
全球焦点!RS485 MODBUS转PROFINET网关案例 | 超声波明渠流量计接入到PLC1200 PROFINE
焦点热门:前后端分离项目解决跨域的终极方法
环球今热点:[Java基础]自动装箱与自动拆箱--为什么整型比较必须用equals?
【天天新要闻】Detecting glass in Simulataneous Localisation and Mapping
天天热文:贝叶斯与卡尔曼滤波(2)--连续随机变量的贝叶斯公式
当前热门:用送的那块布擦镜片:小心眼镜被废!
观热点:60岁快递员意外猝死 快递公司回应:深感痛心 善后已达成一致
女子连刷10个差评商家找上门:不好吃你天天来干嘛 谁生活容易啊
【世界报资讯】果粉入手一加Ace 2:开20个应用不杀后台 苹果开3个应用就不行了
80后回忆的“均瑶牛奶”公司进军新能源车:首款纯电SUV云兔来了 莆田生产
信息:Qt调用摄像头一,基础版
k8s多节点二进制部署以及Dashboard UI
记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历
《原子之心》冰箱诺拉全九国语言配音:怎么没日语?
粉丝发现周深自用手机是iQOO 11 Pro传奇版:5米开外就能看到
电动两轮车总是骑半路就没电?这5种错误充电习惯赶快纠正
世界今头条!男子酷爱嚼槟榔:最终确诊舌癌
【报资讯】免费的ChatGPT意外断网 国内伪装自主的AI露馅了
守护安全|AIRIOT城市天然气综合管理解决方案
0x03_My-OS在实体机上面运行
每日播报!【算法训练营day53】LeetCode1143. 最长公共子序列 LeetCode1035. 不相交的线 LeetCode53. 最大子序和
快讯:两数之和、三数之和、四数之和(双指针)
世界焦点!今日山水一程三生有幸是形容爱情的吗_山水一程三生有幸
环球最资讯丨俞敏洪说想给董宇辉在北京买套房子 这话我听着耳熟
消息!魅族20未发先火!1元超前预订7小时订单破10万
世界热讯:研究称果糖或能导致老年痴呆:专家建议少食用
全球热议:旅日大熊猫香香坐顺丰飞机到家!1个月后与公众见面
环球视讯!成都一公司面试需填芝麻信用分 网友热议
每日信息:100亿级订单怎么调度,来一个大厂的极品方案
[学习笔记]Rocket.Chat业务数据备份
记录--uni-app实现京东canvas拍照识图功能
世界快资讯:Java+Jquer实现趋势图
全球最新:温州特斯拉事故20年驾龄司机仍昏迷:特斯拉回应称难过 重申全力配合调查
环球今热点:Xbox游戏将登陆任天堂主机 网友质疑:NS能带动吗?
世界微资讯!场面爆笑!外国人为开比亚迪开始学中文:难为“小迪”了
即时看!音悦台将回归登热搜!主体公司已成老赖:累计被执行1376万
世界视讯!什么是经营贷什么是消费贷?浅谈二者区别
puppet安装使用踩坑笔记
箭头函数详解
TypeScript 入门自学笔记 — 接口的使用(六)
快资讯丨Python关于异常处理的教程
天天观察:scrollView 嵌套 recyclerview 时 BaseQuickAdapter 九宫格图片拖拽到底部删除
14年老牌网站 音悦台要回归了!官方称很快就要内测
每日快看:杭州发现鱼类新物种苕溪鱲:通体散发宝蓝色金属光泽
当前播报:爱奇艺认错 恢复会员投屏!上海消保委:愿意为消费者叫板
是懂玩家的!《原子之心》为机器人姐妹花开通ins账号
焦点观察:张小泉公开一防菜刀断裂专利 这次拍蒜不断了?
当前最新:中小企业如何有效应对计算资源的弹性变化需求?
热消息:来一波骚操作,Java内存模型
全球新消息丨Windows家庭版安装本地组策略编辑器【gpedit.msc】
Redis详解
当前焦点!@ResponseBody注解的作用
万马股份(002276.SZ):万马新能源充电桩的枪线已经自产 由万马专缆生产
精选!售10-20万元 蔚来整合猎豹工厂:新品牌“萤火虫”落户安徽
今日最新!冲刺IPO!一年狂赚7亿美元 中国跨境电商神话靠啥吸粉?
乐视被强制执行100万:没版权擅自转播了优酷综艺
男子网购iPhone 14开箱发现是iQOO 商家赔50元优惠券被拒
当前动态:曾致135人死亡 印度断桥事故调查报告出炉:钢索严重腐蚀
0x02_My-OS操作系统里的helloworld
天天新资讯:iptables防火墙
世界热议:万物皆可集成资源包!低代码集成系列一网打尽
天天快播:通过例子学习粒子群优化算法
全球速讯:暂时性死区以及函数作用域
全球观察:祸不单行!美国俄亥俄州又现爆炸:30公里外都见到蘑菇云
天天新消息丨2.8K OLED屏+10核CPU 小米首款翻转本降价1000元起
售价高达4199元!森海塞尔HD 660S2开放式动圈耳机正式开售
【世界独家】【算法训练营day52】LeetCode300. 最长递增子序列 LeetCode674. 最长连续递增子序列 LeetCode718. 最长重复子
开心档之Bootstrap4 自定义表单
速读:标准语言的重要性_语言的重要性
环球热讯:《蚁人3》等漫威大片中国吃瘪!国人为国产电影买单 《流浪地球2》等降维打击
世界微速讯:直播预告 | 嵌入式BI如何将数据分析真正融入业务流程
当前快报:(数据库系统概论|王珊)第六章关系数据理论-第一节:为什么要研究关系数据理论
世界播报:C# 利用FluentFTP实现FTP上传下载功能
天天通讯!NBA中国与蚂蚁集团开启全面战略合作:支付宝能看球了!
比亚迪百万级超跑 仰望U9路试谍照首次曝光:变好看了
环球播报:特斯拉中国工厂提速:2023新款Model 3来了 内饰大升级
每日精选:云业务成本的组成与管理趋势
世界快消息!火山引擎数智平台ByteHouse入围稀土掘金《Top10 年度创新产品》
天天快资讯丨前端开发页面性能优化法则
每日热门:爱奇艺修改会员投屏限制后:优酷腾讯尚未跟进 默不作声