【问题标题】:Adding key-value pair to javascript object where key is an object将键值对添加到键是对象的javascript对象
【发布时间】:2016-06-14 15:51:56
【问题描述】:

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) 找到了一些解决方案。但我无法理解这里的概念。任何指导将不胜感激。

【问题讨论】:

标签: javascript javascript-objects


【解决方案1】:

对象键必须是字符串(或符号),因此当您尝试使用对象作为键时,它首先将其转换为字符串表示形式,您已经看到是"[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 对象(去年随 ES6 引入)部分旨在解决这个问题,如果您在 @ 中运行,则允许您直接使用对象作为键987654323@.

【讨论】:

    【解决方案2】:

    任何时候您将某些内容传递给对象的属性访问器(object[...] 语法),它都会被转换为字符串(请参阅“属性名称”下的 here)。

    像您正在使用的普通 Javascript 对象使用 the default toString() 方法转换为字符串,该方法仅返回 "[object Object]"。这就是为什么它们最终都指向相同的值。

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 2010-11-13
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多