JavaScript Map

基本含義

Map 對象 保存鍵值對,與 objects 對象最大的區別是:能夠記住原始插入順序;並可以直接統計總數量;且任何值(對象/原始值)都能作爲一個鍵或一個值。

鍵相等

NaN 是與 NaN 相等的(雖然 NaN !== NaN),剩下所有其它的值是根據 === 運算符的結果判斷是否相等。
(可以理解爲直接用 === 作爲判斷依據)

Objects 和 maps 的比較

objects maps
字符串/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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章