搜尋

首頁  >  問答  >  主體

ES6 Map中使用Array物件作為鍵

我正在嘗試將我的程式碼更新到 ES6,因為我正在使用 Node 4.0 並且到目前為止非常喜歡它的功能。但是,我對新的 ES6 Map 資料結構有問題,因為當使用 Array 作為鍵時,它的行為與 {} 不同。我用它作為計數器地圖。

我運行此程式碼,我想知道如何使用數組作為 Map 的鍵。

"use strict";

var a = new Map();
a.set(['x','y'], 1);
console.log(a.get(['x','y']));

var b = {};
b[['x','y']] = 1;

console.log(b[['x','y']]);

它會印出以下內容,第一行應該是 1 而不是 undefined:

undefined
1

原始的 JS 映射對金鑰進行字串化,我不想使用新的 ES6 Map 進行相同類型的字串化 hack。

如何可靠地使用陣列作為 ES6 Map 的鍵?

P粉344355715P粉344355715402 天前692

全部回覆(2)我來回復

  • P粉529245050

    P粉5292450502023-10-22 13:33:57

    您需要儲存對用作鍵的 Array 的非原始實例的參考。請注意以下兩個範例中的差異:

    "use strict";
    
    var a = new Map();
    a.set(['x','y'], 1);
    console.log(a.get(['x','y']));
    console.log(['x','y'] === ['x','y']);
    
    var b = new Map();
    var array = ['x','y'];
    b.set(array, 1);
    console.log(b.get(array));
    console.log(array === array);

    回覆
    0
  • P粉978551081

    P粉9785510812023-10-22 11:23:32

    了解 ES2015 Map 鍵的比較(幾乎)就像與 === 運算子一樣。兩個陣列實例,即使它們包含相同的值,也不會以 === 的方式相互比較。

    試試這個:

    var a = new Map(), key = ['x', 'y'];
    a.set(key, 1);
    console.log(a.get(key));

    由於 Map 類別旨在用作基底類,因此您也許可以使用重寫的 .get() 函數來實作子類別。

    (第一句中的「幾乎」是反映Map鍵相等性比較是透過Object.is()完成的,這在日常編碼中很少出現。本質上是JavaScript 中相等測試的第三種變體。)

    回覆
    0
  • 取消回覆