【问题标题】:Safely access a property inside a nested javascript object安全地访问嵌套 javascript 对象内的属性
【发布时间】:2019-03-13 10:20:42
【问题描述】:

对象结构如下。

object = {
  obj1: {
    obj2: {
       name: 'MY name'
    }
  }
}

这种结构是动态的,有时不会有 obj1。

因此,在反应中,您将编写类似的代码..

object && obj1 && obj2 && obj2.name

只有当object、obj1和obj2存在时才会显示obj2.name。

在这种情况下,不会有任何未定义的错误,因为在进入函数之前会检查每个对象的存在。

是否有替代上述代码的方法,以便在所有对象都存在时显示名称。 如果不是,它不应该抛出错误。

【问题讨论】:

  • 你可能会发现错误
  • 看看lodash.get
  • … 或者写一些东西来获取以字符串形式传递的属性的“路径” - 然后将其拆分,并递归检查是否定义了“下一个”。
  • 您的问题找到答案了吗?

标签: javascript reactjs


【解决方案1】:

使用 hasOwnProperty 检查 obj1 是否存在

object = {
  obj1: {
    obj2: {
       name: 'MY name'
    }
  }
}
if(object.hasOwnProperty('obj1'))
console.log(object.obj1.obj2.name)
else
console.log(object.obj2.name)

【讨论】:

    【解决方案2】:

    试试

    object = {
      obj1: {
        obj2: {
           name: 'MY name'
        }
      }
    }
        
    var name = (object.hasOwnProperty('obj1'))  ? object.obj1.obj2.name : object.obj2.name;
    console.log(name);

    【讨论】:

      【解决方案3】:

      在读取嵌套属性之前,您需要检查每个属性:

      const name = object && object.obj1 && object.obj1.obj2 && object.obj1.obj2.name;
      

      这既费力又冗长,因为您必须一遍又一遍地重复同样的事情才能访问深度嵌套的属性。

      我建议使用 safeEval 函数,该函数使用 try/catch 包装您潜在的危险属性访问代码,并在发生错误时返回 undefined。 这比手动检查每个属性要短得多:

      const name = safeEval(() => obj.obj1.obj2.name);
      

      这是一个例子:

      const obj = { obj1: { obj2: { name: 'Hello' } } }
      
      function safeEval(fn) {
        try { return fn(); }
        catch { return undefined; }
      }
      
      const a = obj && obj.obj1 && obj.obj1.obj2 && obj.obj1.obj2.name;
      const b = safeEval(() => obj.obj1.obj2.name);
      const c = safeEval(() => obj.obj1.obj2.obj3.obj4.name);
      
      console.log(a, b, c);

      【讨论】:

        【解决方案4】:

        我建议编写一个递归函数来检查对象并在找到名称时递归其子项。我看到其他人建议捕获错误 - 我建议不要对此类运行时错误滥用异常处理。

        【讨论】:

          猜你喜欢
          • 2013-08-13
          • 2022-08-18
          • 2012-11-12
          • 2018-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-13
          • 1970-01-01
          相关资源
          最近更新 更多