如何在JavaScript中使用对象作为键在循环中加载哈希
How to load hash in a loop using objects as keys in JavaScript?
当我试图使用对象作为键加载哈希时,会出现意外行为;即,以后检索数据时,散列总是指最后使用的密钥。我认为这是由于关闭的行为,然而,我认为我已经做了必要的事情来防止这种情况:
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
相关文章:
- 对于加载时间过长的循环来说是巨大的
- 将所选类别循环到ul>李用加载更多按钮
- 文本淡入淡出后循环加载页面
- FileReader加载端中循环变量的值
- 无法从 .each 循环加载谷歌地图上的两个标记
- 在window.print()中加载为循环指令而编译时准备DOM失败
- 如何在背景图像的循环数组中预加载图像
- mysql循环-预加载数据
- 随机页面加载后循环播放其余视频
- Javascript:用循环在谷歌地图上加载标记
- Jquery选项卡:打破创建-选择-重新加载循环
- 替换从外部 IN for 循环加载的 HTML 字符串中的字符
- CasperJS循环加载下一页
- imacro 每 10 次循环加载一次 URL
- 循环加载javascript函数
- 使用for循环加载RSS提要的Javascript
- 使用for循环加载Jssor滑块
- 图像循环加载不到位
- 通过JavaScript循环加载的项没有按正确的顺序显示
- 如何在Imacros中为条件循环加载javascript变量中的csv Col值