繁体   English   中英

安全访问嵌套 javascript 对象内的属性

[英]Safely access a property inside a nested javascript object

对象结构如下。

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

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

因此,在反应中,您将编写代码,例如..

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

这样只有当存在对象、obj1 和 obj2 时,才会显示 obj2.name。

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

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

检查像

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

 let object = { obj1: { } } if(object && object.obj1 && object.obj1.obj2 && object.obj1.obj2.name) { console.log(object.obj1.obj2.name); } else console.log("no obj2.name and no error"); 

使用hasOwnProperty检查obj1是否存在

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

尝试

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

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

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

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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM