【问题标题】:Nested objects, preventing "cannot get value of 'undefined'" [duplicate]嵌套对象,防止“无法获取'未定义'的值”[重复]
【发布时间】:2017-01-11 00:29:03
【问题描述】:

假设我有一个名为 John 的对象,其中包含许多其他嵌套对象,我正在尝试按照以下方式访问它们

if (john.address.highstreet) {
    var highstreet = john.address.highstreet
}

但如果地址属性为空,那么我会得到一个错误

unable to get property 'highstreet' of undefined

我的函数执行停止

有没有一种方法可以访问嵌套属性而无需创建许多嵌套 if 语句,如下所示:

if (john.address) {
    if (john.address.highstreet) {
        var highstreet = john.address.highstreet
    }
}

【问题讨论】:

  • 我会使用类似 lodash 的 get

标签: javascript json


【解决方案1】:

标准方法是

if (john.address && john.address.highstreet) {
    var highstreet = john.address.highstreet
}

如果地址未定义,那么这就是将返回的内容。

【讨论】:

  • 谢谢!这似乎是最好的方法。
  • 请注意,这是可行的,因为 Javascript 布尔运算符是 short-circuiting
  • 确实如此。因此为什么它是 && 而不仅仅是 & - 与 C 相同的约定
【解决方案2】:

您可能希望使用更聪明的方式来访问这些属性。类似于getPropertyByString("john.address.highstreet")。如果路径无法解析,此函数可能返回 null 或 undefined。

Alnitak's response

所以你的代码可能看起来像这样:

var highstreet = getPropertyByString("john.address.highstreet");

【讨论】:

    【解决方案3】:

    另一种方法是使用 try-catch-block。

    try {
        var highstreet = john.address.highstreet;
    } catch (err) {
        // do error handling
    }
    

    【讨论】:

      【解决方案4】:

      您也可以使用 hasOwnProperty 方法来检查属性

      if(john.hasOwnProperty("address") && john.address.hasOwnProperty("highstreet"))
      {
      var highstreet = john.address.highstreet
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        相关资源
        最近更新 更多