我正在学习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/
谢谢!
答案 0 :(得分:0)
这里的问题是,您拥有的2个对象不相同。所以a !== b
。那就是给您两个不同键的原因。
您可以这样做 :(即,为元素a
和b
的所有属性创建唯一标识符
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