首页 > 其他分享 >ES6的Map函数详解

ES6的Map函数详解

时间:2024-08-27 18:17:27浏览次数:12  
标签:ES6 set console log Map 详解 myMap const

一、Map介绍

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值
Map 对象是键值对的集合。Map 中的一个键只能出现一次;它在 Map 的集合中是独一无二的。Map 对象在for…of 循环在每次迭代后会返回一个形式为 [key,value] 的数组

二、简单的使用

const map1 = new Map();

map1.set('a', 1);
map1.set('b', 2);
map1.set('c', 3);
// map取值
console.log(map1.get('a')); // 1
// 可以覆盖
map1.set('a', 97);
console.log(map1.get('a')); // 97
// 类似 数组的 length
console.log(map1.size); // 3
// map 删除
map1.delete('b');
console.log(map1.size); // 2

三、Object 和 Map 的比较

 

四、实例属性介绍

4.1. Map.prototype.size

返回 Map 对象中的键值对数量。

const map = new Map()
map.set('name','张三')
map.size // 1

五、实例方法介绍

5.1. Map.prototype.clear()

移除 Map 对象中所有的键值对。

const myMap = new Map();
myMap.set('bar', 'baz');
myMap.set(1, 'foo');
console.log(myMap.size);  // 2

myMap.clear();

console.log(myMap.size);  // 0

5.2. Map.prototype.delete()

移除 Map 对象中指定的键值对,如果键值对存在并成功被移除,返回 true,否则返回 false。调用 delete 后再调用 map.has(key) 将返回 false

const myMap = new Map();
myMap.set("bar", "foo");
console.log(myMap.delete("bar")); // 返回 true。成功地移除元素
console.log(myMap.has("bar"));    // 返回 false。"bar" 元素将不再存在于 Map 实例中
console.log(myMap.size) // 0
console.log(myMap.get('bar')) // undefined

5.3. Map.prototype.get()

返回与指定的键 key 关联的值,若不存在关联的值,则返回 undefined

const myMap = new Map();
myMap.set("bar", "foo");
console.log(myMap.get('bar')) // foo
myMap.delete("bar")
console.log(myMap.get('bar')) // undefined

5.4. Map.prototype.has()

返回一个布尔值,用来表明 Map 对象中是否存在与指定的键 key 关联的值

const myMap = new Map();
myMap.set("bar", "foo");

console.log(myMap.has("bar"));  // true
console.log(myMap.has("baz"));  // false

5.5. Map.prototype.set()

在 Map 对象中设置与指定的键 key 关联的值,并返回 Map 对象

const myMap = new Map();

// 将一个新元素添加到 Map 对象
myMap.set('bar', 'foo');
myMap.set(1, 'foobar');

// 在 Map 对象中更新某个元素的值
myMap.set('bar', 'baz');

// 链式调用添加元素
myMap.set('bar', 'foo')
  .set(1, 'foobar')
  .set(2, 'baz');

5.6. Map.prototype.keys()

返回一个新的迭代对象,其中包含 Map 对象中所有的键,并以插入 Map 对象的顺序排列

var myMap = new Map();
myMap.set('0', 'foo');
myMap.set(1, 'bar');
myMap.set({}, 'baz');

const mapIter = myMap.keys();

for (const entry of myMap.keys()) {
  console.log(entry);
  // 0
  // 1
  // {}
}

5.7. Map.prototype.values()

返回一个新的迭代对象,其中包含 Map 对象中所有的值

const myMap = new Map();
myMap.set('0', 'foo');
myMap.set(1, 'bar');
myMap.set({}, 'baz');

const mapIter = myMap.values();

for (const entry of myMap.values()) {
  console.log(entry);
  // foo
  // bar
  // baz
}

5.8. Map.prototype.entries()

返回一个新的迭代对象,其为一个包含 Map 对象中所有键值对的 [key, value] 数组,并以插入 Map 对象的顺序排列

const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

const mapIter = myMap.entries();
for (const entry of myMap.entries()) {
  console.log(entry);
  // ["0", "foo"]
  // [1, "bar"]
  // [{}, "baz"]
}

map实例本身就是一个可迭代的entries

const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");
for (const entry of myMap) {
  console.log(entry);
  // ["0", "foo"]
  // [1, "bar"]
  // [{}, "baz"]
}

5.9. Map.prototype.forEach()

以插入的顺序对 Map 对象中存在的键值对分别调用一次 callbackFn。如果给定了 thisArg 参数,这个参数将会是回调函数中 this 的值

const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

myMap.forEach((value, key, map) => {
  console.log(value, key, map);
  // foo 0 可迭代的 map 
  // bar 1 可迭代的 map 
  // baz {} 可迭代的 map 
  for (const inter of map) {
    console.log(inter);
    //["0", "foo"]
    //[1, "bar"]
    //[{}, "baz"]
  }
})

六、其他

6.1. 将 NaN 作为 Map 的键

NaN 也可以作为 Map 对象的键。虽然 NaN 与任何值甚至与自己都不相等(NaN !== NaN 返回 true),但是因为所有的 NaN 的值都是无法区分的,所以下面的例子成立:

const myMap = new Map();
myMap.set(NaN, 'not a number');

myMap.get(NaN);
// "not a number"

const otherNaN = Number('foo');
myMap.get(otherNaN);
// "not a number"

6.2. 使用 for…of 方法迭代 Map

Map 可以使用 for…of 循环来实现迭代:

const myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');

for (const [key, value] of myMap) {
  console.log(`${key} = ${value}`);
}
// 0 = zero
// 1 = one

for (const key of myMap.keys()) {
  console.log(key);
}
// 0
// 1

for (const value of myMap.values()) {
  console.log(value);
}
// zero
// one

for (const [key, value] of myMap.entries()) {
  console.log(`${key} = ${value}`);
}
// 0 = zero
// 1 = one

6.3. Map 与数组的关系

const kvArray = [['key1', 'value1'], ['key2', 'value2']];

// 使用常规的 Map 构造函数可以将一个二维键值对数组转换成一个 Map 对象
const myMap = new Map(kvArray);

console.log(myMap.get('key1')); // "value1"

// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和 kvArray 相同的数组

// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);

// 或者在键或者值的迭代器上使用 Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

6.4. 复制或合并 Maps

// Map 能像数组一样被复制:
const original = new Map([
  [1, 'one'],
]);

const clone = new Map(original);

console.log(clone.get(1)); // one
console.log(original === clone); // false. 浅比较 不为同一个对象的引用

//Map 对象间可以进行合并,但是会保持键的唯一性。
const first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

const second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);

// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的。
// 展开语法本质上是将 Map 对象转换成数组。
const merged = new Map([...first, ...second]);

console.log(merged.get(1)); // uno
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

// Map 对象也能与数组合并:

const first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

const second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);

// Map 对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
const merged = new Map([...first, ...second, [1, 'eins']]);

console.log(merged.get(1)); // eins
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

 

原文

标签:ES6,set,console,log,Map,详解,myMap,const
From: https://www.cnblogs.com/mmzuo-798/p/18383259

相关文章

  • 遥控链路应用行业行业详解!!!
    遥控链路,即遥控器和接收机之间的信号传输链路,其应用行业广泛且多样。1.家电行业传统家电控制:如电视、空调、音响等设备,通过遥控器实现远程控制,极大地方便了用户的日常生活。这些遥控器通过红外线信号或无线电波将控制指令传输给设备,设备内部的接收器接收并解码信号,从而执行......
  • 访问者模式详解
    访问者模式简介:类的内部结构不变的情况下,不同的访问者访问这个对象都会呈现出不同的处理方式。人话:其实就是为了解决类结构不变但操作处理逻辑易变的问题,把对数据的操作都封装到访问者类中,我们只需要调用不同的访问者,而无需改变改变结构类,实现了。举个理发店的例子......
  • 分布式搜索引擎 数据聚合详解
    1.数据聚合**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如何?实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近实时搜索效......
  • Fluent热对流理论详解
    1.牛顿冷却公式流体流过固体表面发生的热量交换称为对流换热。对流换热的基本公式为牛顿冷却公式,即图对流换热示意图对流换计算的关键在于获得流体与固体表面间的传热系数。对流换热是流体得导热和对流两种基本传热方式共同作用的结果。斯坦顿数:Stantonnumber简介:......
  • Android taskset用法详解
    一、简介taskset命令用于设置或者获取一直指定的 PID 对于CPU核的运行依赖关系。通过taskset命令可将某个进程与某个CPU核心绑定,使得其仅在与之绑定的CPU核心上运行关于绑核的解释绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity)。设定以后,Linux调......
  • C++与C语言中基础数据类型详解
    目录引言基础数据类型分类实际编程中的应用建议结论引言在C++与C语言的编程世界中,理解并正确使用基础数据类型是每个程序员的必备技能。不同的数据类型在内存中的占用和表示方式直接影响到程序的性能和行为。本文将详细介绍C++与C语言中常见的基础数据类型,探讨它们......
  • Docker Compose配置详解
    1.什么是DockerCompose?DockerCompose是一种用于定义和运行多容器Docker应用程序的工具。通过一个docker-compose.yml文件,你可以配置应用程序的所有服务(例如,Web服务器、数据库、缓存)并轻松管理它们。2.基本DockerCompose命令docker-composeup:启动并运行docker-compose.ym......
  • 全染色算法及其matlab程序详解
    #################本文为学习《图论算法及其MATLAB实现》的学习笔记#################全染色以及全色数图G的顶点和边满足使相邻或关联的元素得到不同的颜色,则称此染色为G的全染色;其所用最少色数称为G的全色数算法用途给出简单图的染色数尽可能少的全染色方案算法思想从......
  • 网络通信和TCP/IP协议详解
    目录网络协议一、计算机网络是什么?定义和分类计算机网络发展简史二、计算机网络体系结构OSI七层模型TCP/IP模型TCP/IP协议族IP、TCP和UDPTCP/IP网络传输中的数据地址和端口号MAC地址IP地址端口号综述三、TCP特性TCP三次握手为什么TCP握手需要三......
  • 【Go函数详解】二、参数传递、变长参数与多返回值
    文章目录一、传递参数1.按值传参2.引用传参2.1特殊情况2.1.1切片slice2.1.2字典map二、变长参数1.基本定义和传值1.1基本定义1.2传值1.2.1普通传值1.2.2传递切片2.任意类型的变长参数(泛型)三、多返回值1.命名返回值一、传递参数1.按值传参Go语......