【问题标题】:Unable to use Computed Property Values with Dots - Unable to Set as String - JS无法使用带点的计算属性值 - 无法设置为字符串 - JS
【发布时间】:2021-07-11 17:10:50
【问题描述】:

示例代码:https://playcode.io/757707/

看看它记录到控制台的内容。 我不确定是否有办法将名称中带有点的属性值计算为有效的 JSON。

打印的对象中的第三个字段始终是:

{
    dot.notation: "value"
}

为了使其成为有效的 JSON,如果您想要一个点“。”,则需要在属性名称周围加上引号。在属性名称中。

例如有效的 JSON 如下所示:

{
  "dot.notation": "value"
}

在属性名称中使用点似乎是一种不好的做法……但是应该有一种方法可以将该属性显式设置为字符串,这样如果我计算属性名称,JSON 就不会无效。因此,解析该 JSON 对象的 JSON 字符串是行不通的。

有人知道将属性名称显式设置在引号中的解决方法吗?

我很想遵循最佳做法,而不是在属性名称中使用点,但这对于 Looker 中的某些请求是必需的。我在 Looker 为一个客户工作,所以我需要一个解决方法。

【问题讨论】:

  • .toString()JSON.stringify 不一样,是的。
  • @ASDFGerte 这很有帮助!!如果你回答我就接受!

标签: javascript node.js computed-properties


【解决方案1】:

严格来说JSON格式,所有字段名都必须用引号引起来。这是互操作性所必需的,例如将数据发送到 REST API 等。在这些引号中,根据 JSON 规范,几乎允许任何字符串。

在 JavaScript 中,这是比较宽松的,当属性名称很简单时(az、AZ、0-9、_、$),JavaScript 对象不需要引号,否则,出于语言解析的原因,需要引号来消除歧义.

如果您想从字符串值设置属性,只需执行以下操作:

{
  [myStringVariable] : true
}

无需使用引号,这允许您使用几乎任何字符串设置属性。因此,您可以在定义这些字段名称的代码中设置一些常量,然后以一致的方式执行此操作:

const FIELD1 = "my& crazy**field-name";  // Or from some schema definition.
// etc. other field consts.

let myObject = {
  [FIELD1] : true
  // .. etc.
}

还要注意,在这个 [ ] 表示法中,您可以放置​​任何可以计算为字符串的有效 JavaScript 表达式,例如 [myFields.field1Name] 甚至像 [(someCondition ? "unknown" : "myField") ]

最后,这些都不是任何“标准”,只是在字段名称不受您控制的情况下您可能需要考虑的机制 - 因为当它们由您控制时,您应该保持它们的简单性清晰度。

【讨论】:

  • 感谢您的解释!这对我来说更清楚了这个问题。我认为@ASDFGerte 在 cmets 中找到了我的问题的根源。我会先给他回答,但如果他不回答,你编辑你的,我会很乐意接受你的!
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多