簡體   English   中英

當Key是對象時,如何使用Map?

[英]How can I use Map when Key are objects?

我正在學習javascript,但我在這里遇到了問題。 我想在JS中使用一個可以將對象作為鍵的hashmap。

我需要如果我有一個與另一個對象“b”具有相同值的對象“a”,當我將“map.set”放在對象“b”上時,它應該更新對象“a”鍵的值,而不是在“地圖”上創建一個新的鍵/值(在地圖上復制具有相同值的兩個鍵的類型)

我這樣做是因為我正在嘗試創建一個QLearning表,其中每個狀態都是一個對象,但我希望如果在我的代碼的兩個不同迭代中我得到相同的狀態,Map應該引用相同的值。

示例如下:

var QTable = new Map();
var a = {first: 1, second: 2};
var b = {first: 1, second: 2};

QTable.set(a, [0,0,0,0,0,0]);
QTable.set(b, [1,1,1,1,1,1]);

// I would expect to have an Object with a single item, and the values updated to [1,1,1,1,1,1] instead of two objects with the same key-values.

console.log(QTable);

JS小提琴: https//jsfiddle.net/7zht40Lo/

提前致謝!

這里的問題是,你擁有的2個對象是不一樣的。 所以a !== b 那是什么給你兩個不同的鑰匙。

你可以做這樣的事情 :(也就是說,制作元素ab的所有屬性的唯一標識符

var QTable = new Map();
var a = {first: 1, second: 2};
var b = {first: 1, second: 2};

QTable.set("first"+a.first+"second"+a.second+"", [0,0,0,0,0,0]);
QTable.set("first"+b.first+"second"+b.second+"", [1,1,1,1,1,1]);

console.log(QTable);

注意:這可以進行優化。 我只是想讓你知道如何做你想做的事。

有兩種結構:“{first:1,second:2}”,每種結構都存儲為不同的對象。 它們不被認為是計算機的“同一件事” - 即使你是一個棘手的人,也能做出這樣的假設。

計算機盲目地將每個對象寫入內存並將地址返回到分別存儲在內存中的“a”和“b”變量。

var QTable = new Map();
var a = {first: 1, second: 2}; // a now points to address EF75DC3D
var b = {first: 1, second: 2}; // b now points to address 2CBC2EF7

現在,當您引用“a”時,計算機只會將地址引用放在那里。

所以這:

QTable.set(a, [0,0,0,0,0,0]); 
QTable.set(b, [1,1,1,1,1,1]);

......如此認可:

QTable.set(EF75DC3D, [0,0,0,0,0,0]); 
QTable.set(2CBC2EF7, [1,1,1,1,1,1]);

...因為“a”和“b”指向記憶中的不同“事物”

您需要做的是將“b”設置為“a”,如下所示:

var QTable = new Map();
var a = {first: 1, second: 2}; // a now points to address EF75DC3D
var b = a;                     // b is now like an alias to "a"
                               // and will ultimately point to 
                               // "a's" address  EF75DC3D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM