JavaScript Map

基本含义

Map 对象 保存键值对,与 objects 对象最大的区别是:能够记住原始插入顺序;并可以直接统计总数量;且任何值(对象/原始值)都能作为一个键或一个值。

键相等

NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。
(可以理解为直接用 === 作为判断依据)

Objects 和 maps 的比较

objectsmaps
字符串/Symbol任意值(函数、对象、基本类型)
遍历是否按插入顺序返回键值
获取键值对个数手动运算.size 返回
是否可迭代必须先获取键可直接迭代
频繁增删键值对有优势

属性

size

size 属性的值是一个整数,表示 Map 对象有多少个键值对。size 是 只读 属性,用set 方法修改size返回 undefined,即不能改变它的值。

代码演示:

let myMap = new Map();
myMap.set("a", "aaa");
myMap.set("b", "bbb");

console.log(myMap.size); // 2
has

方法has() 返回一个bool值,用来表明map 中是否存在指定元素.

var myMap = new Map();
myMap.set("test", "value");

myMap.has("test");  // returns true
myMap.has("ceshi");  // returns false
myMap.has("value");  // returns false
get

get() 方法返回某个 Map 对象中的一个指定元素。
myMap.get(key); key: 必须参数,也是它唯一的参数
返回一个 Map 对象中与指定键相关联的值,如果找不到这个键则返回 undefined

let myMap = new Map();
myMap.set("test", "hhh");

myMap.get("test");  // 返回 "hhh"
myMap.get("ceshi");  // 返回 undefined
set

set() 方法为 Map 对象 添加. 或 更新 一个指定了键(key)和值(value)的(新)键值对。

let myMap = new Map();

// 将一个新元素添加到 Map 对象
myMap.set("test", "hhh");
myMap.set(1, "one");

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

// 链式设置更新某个元素的值
myMap.set('test', 'hhh')
     .set(1, '111')
     .set(2, '222');
keys

keys() 返回一个新的 Iterator 对象。它包含按照顺序插入 Map 对象中每个元素的key值。

var myMap = new Map();
myMap.set("0", "000");
myMap.set(1, 111);
myMap.set({}, "222");

var mapIter = myMap.keys();

console.log(mapIter.next().value); // "0"
console.log(mapIter.next().value); // 1
console.log(mapIter.next().value); // Object
values

values() 方法返回一个新的Iterator对象。它包含按顺序插入Map对象中每个元素的value值。

var myMap = new Map();
myMap.set("0", "000");
myMap.set(1, 111);
myMap.set({}, "222");

var mapIter = myMap.keys();

console.log(mapIter.next().value); // "000"
console.log(mapIter.next().value); // 111
console.log(mapIter.next().value); // "222"
entries

entries() 方法返回一个新的包含 [key, value] 对的 Iterator 对象,返回的迭代器的迭代顺序与 Map 对象的插入顺序相同。

var myMap = new Map();
myMap.set("0", "test");
myMap.set(1, "ceshi");

var mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "test"]
console.log(mapIter.next().key); // undefined
clear
  • clear() 方法会移除Map对象中的所有元素。
let myMap = new Map();
myMap.set("test", "1");
myMap.set(1, "2");

myMap.size;       // 2
myMap.has("test"); // true

myMap.clear();

myMap.size;       // 0
myMap.has("test")  // false
delete
  • delete() 方法用于移除 Map 对象中指定的元素。
  • 参数:从 Map 对象中移除的元素的键。
  • 返回值:如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false。
let myMap = new Map();
myMap.set("test", "1");

myMap.delete("test"); // 返回 true。成功地移除元素
myMap.has("test");    // 返回 false。"test" 元素将不再存在于 Map 实例中
forEach
  • forEach() 方法将会以插入顺序对 Map 对象中的每一个键值对执行一次参数中提供的回调函数。
function logMapElements(value, key, map) {
    console.log("m[" + key + "] = " + value);
}
Map([["test", 3], ["shiyan", {}], ["ceshi", undefined]]).forEach(logMapElements);
// logs:
// "m[test] = 3"
// "m[shiyan] = [object Object]"
// "m[ceshi] = undefined"

代码

使用 for…of 方法迭代 Map
Map 与数组的关系
复制或合并 Maps
  1. 像数组一样合并

    let original = new Map([
      [1, 'one']
    ]);
    
    let clone = new Map(original);
    
    console.log(clone.get(1)); // one
    console.log(original === clone); // false. 浅比较 不为同一个对象的引用
    
  2. Map对象间可以进行合并,但是会保持键的唯一性

    let first = new Map([
      [1, 'one'],
      [2, 'two'],
      [3, 'three'],
    ]);
    
    let second = new Map([
      [1, 'uno'],
      [2, 'dos']
    ]);
    
    // 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
    // 展开运算符本质上是将Map对象转换成数组。
    let merged = new Map([...first, ...second]);
    
    console.log(merged.get(1)); // uno
    console.log(merged.get(2)); // dos
    console.log(merged.get(3)); // three
    
  3. Map对象也能与数组合并

    let first = new Map([
      [1, 'one'],
      [2, 'two'],
      [3, 'three'],
    ]);
    
    let second = new Map([
      [1, '1'],
      [2, '2']
    ]);
    
    // Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
    let merged = new Map([...first, ...second, [1, '3']]);
    
    console.log(merged.get(1)); // 3
    console.log(merged.get(2)); // '2'
    console.log(merged.get(3)); // 'three'
    

参考链接

[1] MDN Map
[2] MDN Map.prototype.size

### JavaScript 中 `Map` 对象的用法 #### 创建 Map 实例 可以使用构造函数创建一个新的 `Map` 对象。 ```javascript const myMap = new Map(); ``` #### 添加键值对到 Map 通过调用 `.set(key, value)` 方法来向 `Map` 中添加新的条目[^1]。 ```javascript myMap.set('key1', 'value1'); myMap.set('key2', 'value2'); ``` #### 获取指定键对应的值 利用 `.get(key)` 来检索存储于给定键中的数据项。 ```javascript console.log(myMap.get('key1')); // 输出 "value1" ``` #### 检查是否存在某个键 `.has(key)` 可用于判断某特定键是否存在于当前映射表内。 ```javascript if (myMap.has('key2')) { console.log("存在 key2"); } ``` #### 删除键及其关联的数据 要移除一对键/值组合,可采用 `.delete(key)` 函数。 ```javascript myMap.delete('key1'); // 返回 true 表明删除成功 ``` #### 清空整个 Map 结构 当需要一次性清除所有的键值对时,应该运用 `.clear()` 方法。 ```javascript myMap.clear(); // 移除所有元素 ``` #### 遍历 Map 内容 遍历操作可以通过多种方式实现,比如使用for...of循环迭代器模式访问每一条记录。 ```javascript // 使用 for..of 循环打印每一组键值对 for (let [key, value] of myMap.entries()) { console.log(`${key} -> ${value}`); } // 或者只获取 keys() 和 values() for (let key of myMap.keys()) { console.log(`Key: ${key}`); } for (let value of myMap.values()) { console.log(`Value: ${value}`); } ``` #### 转换为数组形式 如果希望快速得到由 `[key,value]` 组成的一维或多维数组,则可以直接转换: ```javascript Array.from(myMap); // [[k1,v1],[k2,v2],...] // 或者更简洁的方式 [...myMap]; // 同上效果 ``` 以上就是关于如何在 JavaScript 中定义并操控 `Map` 数据结构的一些基本介绍以及实用的例子。这些特性使得处理复杂类型的集合变得简单而高效[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值