[英]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.