如何在JavaScript中使用对象作为键在循环中加载哈希

How to load hash in a loop using objects as keys in JavaScript?

本文关键字:循环 加载 哈希 JavaScript 对象      更新时间:2023-09-26

当我试图使用对象作为键加载哈希时,会出现意外行为;即,以后检索数据时,散列总是指最后使用的密钥。我认为这是由于关闭的行为,然而,我认为我已经做了必要的事情来防止这种情况:

var hash = {};
var arry = [];
var list = [{val:"a"},{val:"b"},{val:"c"}];
var len  = list.length;
dump("load : 'n");
for (var i=0;i<len;i++) {
  let pos = i;
  let obj = list[pos];
  hash[obj] = obj.val;
  arry.push(obj);
  dump("    "+obj.val+"    "+hash[obj]+"'n");
}
dump("retrieve : 'n");
for (var i=0;i<len;i++) {
  let pos = i;
  let obj = list[pos];
  dump("    "+obj.val+"    "+arry[pos].val+"    "+hash[obj]+"'n");
}

输出为:

load :
    a    a
    b    b
    c    c
retrieve :
    a    a    c
    b    b    c
    c    c    c

我故意通过使用let来提高迭代对象的范围来防止这种情况的发生,但我显然还是遗漏了一些东西。我想了解这背后的原因,以及如何防止使用Javascript。

JavaScript中的对象键只能是字符串。这意味着,如果您传递的东西不是字符串,它将被转换为字符串。由于您使用的对象不会"覆盖"Object.toString,因此它们都将具有相同的字符串表示形式(即"[object Object]"),这就是为什么哈希总是引用最后使用的键。

更多信息:Javascript对象属性的奇怪相等问题

要扩展@Matt Ball的答案:

可以使用JSON.stringify对对象进行字符串处理。

var a = {};
a.b = 1;
JSON.stringify(a);
// '{"b": 1}'

注意:不能字符串化圆形对象:

var a = {};
a.a = a;
JSON.stringify(a);
// TypeError: Converting circular structure to JSON