Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成”[object Object]“。

ES6提供了”值-值“对的数据结构,键名不仅可以是字符串,也可以是对象。它是一个更完善的Hash结构。

特性

1.键值对,键可以是对象。
const map1 = new Map()
const objkey = {p1: 'v1'} map1.set(objkey, 'hello')
console.log(map1.get(objkey))

结果:

hello

2.Map可以接受数组作为参数,数组成员还是一个数组,其中有两个元素,一个表示键一个表示值。

const map2 = new Map([
['name', 'Aissen'],
['age', 12]
])
console.log(map2.get('name'))
console.log(map2.get('age'))

结果:

Aissen
12

操作

1.size

获取map的大小。

const map3 = new Map();
map3.set('k1', 1);
map3.set('k2', 2);
map3.set('k3', 3);
console.log('%s', map3.size)

结果:

3

2.set

设置键值对,键可以是各种类型,包括undefined,function。
const map4 = new Map();
map4.set('k1', 6) // 键是字符串
map4.set(222, '哈哈哈') // 键是数值
map4.set(undefined, 'gagaga') // 键是 undefined const fun = function() {console.log('hello');}
map4.set(fun, 'fun') // 键是 function console.log('map4 size: %s', map4.size)
console.log('undefined value: %s', map4.get(undefined))
console.log('fun value: %s', map4.get(fun))

结果:

map4 size: 4
undefined value: gagaga
fun value: fun

也可对set进行链式调用。

map4.set('k2', 2).set('k3', 4).set('k4', 5)
console.log('map4 size: %s', map4.size)

结果:

map4 size: 7

3.get

获取键对应的值。

const map5 = new Map();
map5.set('k1', 6)
console.log('map5 value: %s', map5.get('k1'))

结果:

map5 value: 6

4.has

判断指定的键是否存在。

const map6 = new Map();
map6.set(undefined, 4)
console.log('map6 undefined: %s', map6.has(undefined))
console.log('map6 k1: %s', map6.has('k1'))

结果:

map6 undefined: true
map6 k1: false

5.delete

删除键值对。

const map7 = new Map();
map7.set(undefined, 4)
map7.delete(undefined)
console.log('map7 undefined: %s', map7.has(undefined))

结果:

map7 undefined: false

6.clear

删除map中的所有键值对。

const map8 = new Map();
map8.set('k1', 1);
map8.set('k2', 2);
map8.set('k3', 3);
console.log('map8, pre-clear size: %s', map8.size)
map8.clear()
console.log('map8, post-clear size: %s', map8.size)

结果:

map8, pre-clear size: 3
map8, post-clear size: 0

遍历

1.keys()

遍历map的所有key。

const map9 = new Map();
map9.set('k1', 1);
map9.set('k2', 2);
map9.set('k3', 3);
for (let key of map9.keys()) {
console.log(key);
}

结果:

k1
k2
k3

2.values()

遍历map所有的值。

for (let value of map9.values()) {
console.log(value);
}

结果:

1
2
3

3.entries()

遍历map的所有键值对。

方法1:

for (let item of map9.entries()) {
console.log(item[0], item[1]);
}

结果:

k1 1
k2 2
k3 3

方法2:

for (let [key, value] of map9.entries()) {
console.log(key, value);
}

结果不变。

4.forEach()

遍历map的所有键值对。

map9.forEach(function(value, key, map) {
console.log("Key: %s, Value: %s", key, value);
});

结果:

Key: k1, Value: 1
Key: k2, Value: 2
Key: k3, Value: 3

forEach有第二个参数,可以用来绑定this。

这样有个好处,map的存储的数据和业务处理对象可以分离,业务处理对象可以尽可能的按职责分割的明确符合SRP原则。

const output = {
log: function(key, value) {
console.log("Key: %s, Value: %s", key, value);
}
}; map9.forEach(function(value, key, map) {
this.log(key, value);
}, output);

和其它结构的互转

1.Map To Array

使用扩展运算符三个点(...)可将map内的元素都展开的数组。

const map10 = new Map();
map10.set('k1', 1);
map10.set('k2', 2);
map10.set('k3', 3);
console.log([...map10]);

结果:

[ [ 'k1', 1 ], [ 'k2', 2 ], [ 'k3', 3 ] ]

2.Array To Map

使用数组构造Map。

const map11 = new Map([
['name', 'Aissen'],
['age', 12]
])
console.log(map11)

结果:

Map { 'name' => 'Aissen', 'age' => 12 }

3.Map To Object

写一个转换函数,遍历map的所有元素,将元素的键和值作为对象属性名和值写入Object中。

function mapToObj(map) {
let obj = Object.create(null);
for (let [k,v] of map) {
obj[k] = v;
}
return obj;
} const map12 = new Map()
.set('k1', 1)
.set({pa:1}, 2);
console.log(mapToObj(map12))

结果:

{ k1: 1, '[object Object]': 2 }

4.Object To Map

同理,再写一个转换函数便利Object,将属性名和值作为键值对写入Map。

function objToMap(obj) {
let map = new Map();
for (let k of Object.keys(obj)) {
map.set(k, obj[k]);
}
return map;
} console.log(objToMap({yes: true, no: false}))

结果:

Map { 'yes' => true, 'no' => false }

5.Set To Map

const set = new Set([
['foo', 1],
['bar', 2]
]);
const map13 = new Map(set)
console.log(map13)

结果:

Map { 'foo' => 1, 'bar' => 2 }

6.Map To Set

function mapToSet(map) {
let set = new Set()
for (let [k,v] of map) {
set.add([k, v])
}
return set;
} const map14 = new Map()
.set('k1', 1)
.set({pa:1}, 2);
console.log(mapToSet(map14))

结果:

Set { [ 'k1', 1 ], [ { pa: 1 }, 2 ] }

End

ES6,新增数据结构Map的用法的更多相关文章

  1. ES6新增的Map和WeakMap 又是什么玩意?非常详细的解释

    上一篇文章讲了set和weakSet,这节咱就讲Map和weakMap是什么?这两篇文章并没有什么联系,主要知识用法类似而已.嘿嘿,是不是感觉舒服多了. 什么是Map 介绍什么是Map,就不得不说起O ...

  2. ES6——新增数据结构Set与Map的用法

    ES6 提供了新的数据结构 Set以及Map,下面我们来一一讲解. 一.Set 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 1.单一 ...

  3. ES6,新增数据结构Set的用法

    ES6 提供了新的数据结构 Set. 特性 似于数组,但它的一大特性就是所有元素都是唯一的,没有重复. 我们可以利用这一唯一特性进行数组的去重工作. 单一数组的去重. let set6 = new S ...

  4. ES6,新增数据结构WeakSet的用法

    WeakSet和Set类似,同样是元素不重复的集合,它们的区别是WeakSet内的元素必须是对象,不能是其它类型. 特性: 1.元素必须是对象. 添加一个number类型的元素. const ws = ...

  5. ES6新增的数据类型Map和Set。

    Javascript的默认对象表示方式 {} ,即一组键值对. 但是Javascript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问 ...

  6. es6入门7--Set Map数据结构

    本文作为ES6入门第十三章的学习整理笔记,可能会包含少部分个人的理解推测,若想阅读更详细的介绍,还请阅读原文ES6入门 一.set数据结构 1.set不接受重复值 ES6新增了Set构造函数用于创建s ...

  7. ES6学习:Map结构的目的和基本用法

    Map结构的目的和基本用法 JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键.这给它的使用带来了很大的限制.   1 2 3 4 5 6 7 8 ...

  8. js ES6 Set和Map数据结构详解

    这篇文章主要介绍了ES6学习笔记之Set和Map数据结构,结合实例形式详细分析了ECMAScript中基本数据结构Set和Map的常用属性与方法的功能.用法及相关注意事项,需要的朋友可以参考下   本 ...

  9. Js基础知识7-Es6新增对象Map和set数据结构

    前言 JavaScript中对象的本质是键值对的集合,ES5中的数据结构,主要是用Array和Object,但是键只能是字符串.为了弥补这种缺憾,ES6带来了一种新的数据结构Map. Map也是键值对 ...

随机推荐

  1. Environment error: “CodeBloks can't find compiler executable in your configured search path's for GNU GCC compiler”

    codeblock安装后,提示cant find compiler executable in your configured search paths for GNU GCC Compiler 可能 ...

  2. PushBackInputStream回退流

    [例子1] import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.PushbackInputS ...

  3. guacamole部署

    centos7.6 安装java export JAVA_HOME=/usr/jvm/javaexport JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAV ...

  4. svn版本管理工具的使用

    安装参考http://www.cnblogs.com/macula/archive/2012/02/12/2347637.html 主要的使用步骤如下: 建立版本管理库: svnadmin creat ...

  5. NOIP 2000 乘积最大

    分析: 这一题虽然是加强版的,但也就是数据范围比原题大了点儿,思路都一样,在原题的基础上加一个高精度乘法就OK了,下面说一下算法:看到题首先想到的就是动态规划,你会发现这一题极像一道经典题目---添加 ...

  6. C# try catch finally简单介绍和应用

    今天看代码书的时候,有用到try--catch--finally,然后就查了下具体的注意事项和应用. 简单来说就是: try { //有可能出错误的代码或者代码片段       } catch{ // ...

  7. Java中使用Timer和TimerTask实现多线程

    转自:http://www.bdqn.cn/news/201305/9303.shtml 摘要:Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以 ...

  8. Spark2.3(三十六):根据appName验证某个app是否在运行

    具体脚本 #/bin/sh #LANG=zh_CN.utf8 #export LANG export SPARK_KAFKA_VERSION=0.10 export LANG=zh_CN.UTF- # ...

  9. 未解决:长字符串含…

    用reduce拼了一个超长sql语句,大约65000字符,运行通不过,报错: OperationalError: (1054, "Unknown column 'nan' in 'field ...

  10. .NET Core修改监听端口

    把Program.cs加一行UseUrls代码如下: using System.IO; using Microsoft.AspNetCore.Hosting; using Microsoft.AspN ...