javascript - 将键值对添加到 javascript 对象,其中 key 是一个对象

标签 javascript javascript-objects

1) 我试图将一系列键值对添加到 JS 普通对象中,其中键本身是一个对象。每次我添加键值对时,该对象都会被覆盖(请参阅实时 here )。

var x = {};

var y = {
  'name': 'cat',
  'note': 'lazy animal'
}
var yy = 'meow'

x[{
  'name': 'dog',
  'note': 'loyal animal'
}] = 'bhow'
x[y] = yy

for(var k in x) {
  console.log(k);
  console.log(x[k]);
}

控制台输出:

"[object Object]"
"meow"

2) 当键是字符串时,不会发生这种情况(覆盖行为)(请参阅实时 here )。

var x = {};

var y = 'cat'
var yy = 'meow'

x['dog'] = 'bhow'
x[y] = yy

for(var k in x) {
  console.log(k);
  console.log(x[k]);
}

控制台输出:

"dog"
"bhow"
"cat"
"meow"

想了解为什么会发生这种情况吗?

我通过研究其他问题找到了一些解决方案(here)。但我无法理解这里的概念。任何指导将不胜感激。

最佳答案

对象键必须是字符串(或符号),因此当您尝试使用对象作为键时,它首先将其转换为字符串表示形式,您看到的是“[object Object]” .

但是,您可以通过覆盖对象上的toString函数来完成您想做的事情,只要您为每个对象返回一个唯一的字符串(可能是对象内容的哈希值),您的代码将按预期工作,因为它将使用 toString 函数来获取对象的字符串表示形式,并将其用作键:

var x = {};

var y = {
  'name': 'cat',
  'note': 'lazy animal',
  toString: function() {
    return 'yobj';
  }
};
var yy = 'meow';

x[{
  'name': 'dog',
  'note': 'loyal animal',
  toString: function() {
    return 'xobj';
  }
}] = 'bhow';
x[y] = yy;

for (var k in x) {
  console.log(k);
  console.log(x[k]);
}

<小时/>

正如 Jared 在 his comment 中提到的那样,Map object(去年在 ES6 中引入)部分是为了解决这个问题而设计的,如果你在 environment that supports its use 中运行,它允许你直接使用对象作为你的键。 .

关于javascript - 将键值对添加到 javascript 对象,其中 key 是一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816752/

相关文章:

javascript - 我如何在 javascript(使用 redux)中构造数据,如果逻辑发生变化,这将消耗更少的内存并且将来可以轻松修改?

javascript - jQuery - 不确定如何在使用 .each 时重置数组的最大值

Javascript Google Signin 未捕获异常 [object Object]

javascript - Firefox OS 特权应用 : Permission denied to access property 'document' of new window object created

javascript - 如何使用没有 `strictTemplates` 的自定义事件(不是事件发射器)来提示 `$event` 不是自定义事件类型?

javascript - 这个生成的代码应该(打算)做什么?

javascript - nodeJS - ioredis NPM 模块 - 订户事件有问题

javascript - 将方法分配给 JavaScript 对象的代码中的问题

javascript - 拆分账单 - JavaScript 练习

javascript - 如何从数组中删除对象?