【问题标题】:How to create a {key:value} object from two variables? [duplicate]如何从两个变量创建一个 {key:value} 对象? [复制]
【发布时间】:2016-10-08 12:55:22
【问题描述】:

我想创建一个{key:value} 类型的对象,其中键名是可变的。此类对象必须提供给chrome.storage.<storageType>.set(keys, function(){...})

很多关于 SO 的相关问题以及有效的答案,但我无法找到问题的合适解释。它归结为在 JSON 对象上设置属性。我做了这个测试:

var desiredKey = "123",
    desiredValue = "Value for key 123",
    foo;

// 1-The basic: Using a literal
console.log({ "123": desiredValue });

// 2-The problem occurs when the key name is not a literal
console.log({ desiredKey: desiredValue });

// 3-The solution is to assign a key explicitely
foo = {};
foo[desiredKey] = desiredValue;
console.log(foo);

结果:

Object { 123: "Value for key 123" }          <-- Literal
Object { desiredKey: "Value for key 123" }   <-- Variable (wrong)
Object { 123: "Value for key 123" }          <-- Assignment (ok)

问题:

  • 为什么方法 2 会失败?存储什么? desiredKey的引用/地址?
  • 方法3是最简单的吗?还是有一个单一的指令解决方案?

【问题讨论】:

  • “归结为在 JSON 对象上设置属性。” 不,它没有,因为这与 JSON 无关。 JSON 是一种用于数据交换的文本表示法(More) 如果您正在处理 JavaScript 源代码,而不是处理 string,那么您就不是在处理 JSON。您要做的是创建一个具有名称来自变量的属性的对象。
  • @T.J.Crowder:感谢您的解释,我显然不清楚。

标签: javascript dictionary ecmascript-6


【解决方案1】:

方法四

Computed property:

从 ECMAScript 2015 开始,对象初始值设定项语法也支持计算属性名称。这允许您将表达式放在括号 [] 中,该表达式将被计算为属性名称。这与 property accessor 语法的括号表示法对称,您可能已经用它来读取和设置属性。

var desiredKey = "123",
    desiredValue = "Value for key 123",
    foo = { [desiredKey]: desiredValue };

console.log(foo);

【讨论】:

  • 你肯定知道这是一个重复的问题。
  • 结果是"123": "Value for key 123",这似乎与123: "Value for key 123" 不同,但这可能是浏览器控制台和站点渲染器之间的差异。我也在寻找解释。
  • 对象的键总是字符串。 console.log 可能会有所不同,因为它不是 ecma 脚本的一部分。
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 2012-09-08
  • 2011-02-26
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多