ES6中Map数据结构学习笔记
很多东西就是要细细的品读然后做点读书笔记,心理才会踏实…
Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制。
1 |
var d = {} |
上段代码的原意是将DOM节点作为对象d
的键,由于对象只接受字符串,所以ele被自动转为[object HTMLBodyElement]
为了解决这种限制,ES6提供了Map数据结构,类似于对象,但是键的范围不限制于字符串,各类数据类型(包括对象)都可以作为键。
Map基本用法
请看代码
1 |
var m = new Map() |
演示过程如下
Map构造函数可以接收数组作为参数,该数组的成员是一个个表示键值对的数组,如
1 |
var arr = [ ['name', 'liujiangbei'], ['title', '屌丝男'] ] var map = new Map(arr) |
该过程就好比
1 |
var map = new Map() |
另外需要特别注意,只有对同一个对象的引用,Map结构才将其视为同一个key。一定是内存地址是一样的两个值。
对同一个key进行set,后面的值会覆盖前边的值。
1 |
var m = new Map() |
Map的键实际上跟内存地址绑定,只要内存不一样,就视为两个key,这就解决了同名属性碰撞的问题,
如果Map的键是简单类型(数字、字符串、布尔),则只要两个值严格相等,Map就将其视为同一个Key,虽然NaN === NaN
为FALSE,但Map将其视为同一Key
1 |
let map = new Map() |
这个地方也要特别注意…
Map实例属性和方法
属性和方法
- size属性
- set(k, v)
- get(k)
- has(k)
- delete(k)
- clear()
遍历方法
- keys()
- values()
- entries()
- forEach()
1 |
for (let [k, v] of map.entries) { console.log(k, v) } |
等同于
1 |
for (let [k, v] of map) { console.log(k, v) } |
因为表示Map结构的默认遍历器结构(Symbol.iterator
)就是entries
方法
1 |
var map = new Map() |
forEach()方法
1 |
var obj = {} |
Map和Array等数据结构的化学反应
Map和Array
前边讲到Map的构造函数接收数组,所以Map和Array之间的转化比较方便,但是也有一些约束。
大专栏 ES6中Map数据结构学习笔记ap">Array转Map
1 |
var arr = [[1, 'ext', '1'], ['2', 2], [3, '3', 'ext']] |
可以看出数组转为Map需要满足,数组的元素为数组或者object。
Map转Array
利用扩展运算符...
很容易实现
1 |
var arr = [ |
利用Array的map和filter方法实现Map的map和filter特性
Map本身并没有map和filter方法,由于数组和Map转换很方便所以利用数组的map的filter特性从而实现达到map和filter的特性。
1 |
var arr = [[1, '1'], [2, '222'], [3, '333']] |
Map和Object
Map转为Object
如果Map的键全为字符串、数字、bool,则其可以转为对象,键非字符串的会通过.toString()方法转化。
1 |
function mapToObj (map) { |
Object转为Map
1 |
function objToMap (obj) { |
Map和JSON
Map转为JSON
Map的键都是字符串,这是直接转为对象JSON
1 |
JSON.stringify(mapToObj(obj)) |
Map的键有非字符串,这是可选择转为数组JSON
1 |
JSON.stringify([...map]) |
JSON转Map
JSON都是字符串的方式,所以先通过JSON.parse(jsonStr)
转为对象,然后通过上边的objToMap
即可实现转化
有一种特殊情况,整个JSON就是一个数组,诶个数组成员又都是有两个成员的数组,他可以一一对应转为Map
1 |
new Map(JSON.parse(jsonStr)) |
结束语
网络上这么多同类型的文章为何我还要多此一举?
看到的永远是别人的,写下来才是自己的,知易行难,日拱一卒,坚持比什么都重要!这句话送给大家也送给我自己…
ES6中Map数据结构学习笔记的更多相关文章
- ES6中map数据结构学习
在项目中遇到一个很恶心的需求,然后发现ES6中的map可以解决,所以简单学习了一下map. Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是“字符串-值”对,属性只 ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
- ES6-Set和Map数据结构学习笔记
Set和Map数据结构 Set 基本用法 ES6提供了新的数据结构--Set,类似于数组,但是成员的值是唯一的,没有重复的值,Set本身是一种构造函数,用来生成Set数据结构 var s = new ...
- ES6中map数据结构
key值可以任意值或对象,value值可以是任意值或对象 let json={ name:'eternity', skill:'java' }; let map=new Map(); map.set( ...
- ES6中map和set用法
ES6中map和set用法 --转载自廖雪峰的官方网站 一.map Map是一组键值对的结构,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Arra ...
- C++中的ravalue学习笔记
一.学习笔记 1. A a = 42; 会先以42为参数构造一个A类对象,然后调用拷贝构造函数来构造a,目前编译器优化掉了拷贝构造函数的调用,测试拷贝构造函数是没有被调用的,但是其权限不能为priva ...
- 我的Android进阶之旅------>Android中编解码学习笔记
编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...
- ES6基础教程一 学习笔记
一.变量的声明 1.var 声明全局变量 在ES6中var用来声明全局变量. 2.let 声明局部变量 3.const 声明常量 二.变量的解构赋值 //1.数组赋值 let [a,b,c]=[1,2 ...
- ES6中Map与其他数据结构的互相转换
最近在学习ES6的基础知识,整理了一下Map与其他数据结构相互转换的写法. Map转为数组的方法 let myMap = new Map([[true, 7], [{foo: 3}, ['abc']] ...
随机推荐
- Java虚拟机(JVM) - 学习总结(全)
深入理解java虚拟机---学习总结: 1.Java内存区域 1.1 java运行时数据区 Java 虚拟机所管理的内存如下图所示,基于JDK1.6. 基于jdk1.8画的JVM的内存模型 (1) 程 ...
- DOCKER 学习笔记2 认识dockerfile自定义镜像
Dockerfile 概念 Dockerfile 是一个文本文件,但包含所构建容器在运行时候的参数.库.资源配置.可以简单理解为我们现有的镜像,比如Centos/Nginx 但我们需要构建一个容器的时 ...
- CodeForces 994B Knights of a Polygonal Table(STL、贪心)
http://codeforces.com/problemset/problem/994/B 题意: 给出n和m,有n个骑士,每个骑士的战力为ai,这个骑士有bi的钱,如果一个骑士的战力比另一个骑士的 ...
- D. New Year and Conference(区间交,线段树)
题:https://codeforces.com/contest/1284/problem/D 题意:给定n个1对的时间断,我是这么理解的,甲去参加a时间段的讲座,乙去参加b时间段的讲座,然后若这n对 ...
- 什么是MTF曲线
MTF(Modulation Transfer Function)是衡量镜头性能的一个重要指标.将镜头把被摄体所具有的对比度再现到像面上的忠诚度以空间频率特性进行表示,便绘成了MTF曲线图. 曲线图的 ...
- eclipse导入项目报错解决方法
1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...
- Zabbix常用监控项整理
zabbix常用key:http://blog.51cto.com/ttxsgoto/1771752 linux主机cpu使用率超过90%的时候报警:https://blog.csdn.net/reb ...
- 求Fibonacii数列的第40个数
public class Fibonacii{ public int m1(int n){ if(n == 1||n == 2){ return 1; } return m1(n-1) + m1(n- ...
- LeetCode No.136,137,138
No.136 SingleNumber 只出现一次的数字 题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明:你的算法应该具有线性时间复 ...
- python学习笔记(19)-切片
转自https://www.jianshu.com/p/15715d6f4dad 在利用python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的 ...