当键是对象时,如何使用地图?

时间:2019-05-18 16:03:42

标签: javascript

我正在学习javascript,但是这里有一个问题。 我想要一个可以将对象作为键的JS哈希表。

我需要,如果我有一个对象“ a”的值与另一个对象“ b”的值相同,那么当我将“ 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 个答案:

答案 0 :(得分:0)

这里的问题是,您拥有的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);

注意:这可以优化。我只是想给您一个关于如何做自己想要的事的想法。

答案 1 :(得分:0)

有两个结构:“ {第一个:1,第二个: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