Javascript映射使用HtmleElement作为键

Javascript映射使用HtmleElement作为键,javascript,dictionary,Javascript,Dictionary,正如标题所示,我使用HtmleElement作为javascript映射容器的键 考虑下面的例子 let map = new Map(), nodeA = document.createElement("b"), nodeB = document.createElement("b"); map[nodeA] = 5; console.log(map[nodeB]); // prints 5 很明显,nodeA.isSameNode(nodeB)会给你错误的答案 在玩了一会

正如标题所示,我使用HtmleElement作为javascript映射容器的键

考虑下面的例子

let map =  new Map(), 
    nodeA = document.createElement("b"), 
    nodeB = document.createElement("b");
map[nodeA] = 5;
console.log(map[nodeB]); // prints 5
很明显,nodeA.isSameNode(nodeB)会给你错误的答案

在玩了一会儿之后,我发现Map会将具有相同标记名的元素视为“相等”,而不管它们是否实际上是相同的节点

有没有办法避免这种行为?i、 我希望不同的节点被视为不同的键

编辑感谢MarcelD指出。我的意思是说map[nodeB]是固定的,多亏了这些答案。愚蠢的错误

你没有按预期使用

您需要编写
map.set(nodeA,5)
,而不是
map[nodeA]=5。
否则,只需添加一个带有字符串键
“[object HTMLElement]”和值
5的新属性即可

让nodeA=document.createElement(“b”);
设nodeB=document.createElement(“b”);
设map=newmap();
地图集(nodeA,5);
map.set(nodeB,1);
console.log(map.get(nodeA));//5.

console.log(map.get(nodeB));//1
@leum是对的。所以你应该解决这个问题。但为了回答你的问题:

映射有键、值对。虽然有了地图,你可以放任何你想要的东西,但它仍然是一把钥匙。例如:一个唯一的标识符。如果需要不同的对象,则需要不同的关键点

为了让你解决这个问题,我会先检查这个密钥是否已经存在,如果它确实添加了一个数字或其他东西使其不合格(e.a.“_1”),然后检查它是否存在!重复直到它是唯一的


要重新阅读,只需检查最后一部分是否有下划线和数字值。

您确定您的示例描述了您的问题吗?因为在本例中,console.log(nodeB)不会打印5;)