对象结构如下。
object = {
obj1: {
obj2: {
name: 'MY name'
}
}
}
此结构是动态的,有时不会有obj1。
因此,在反应中,您将像编写代码。
object && obj1 && obj2 && obj2.name
这样,仅当存在object,obj1和obj2时,才会显示obj2.name。
在这种情况下,不会出现任何未定义的错误,因为在进入函数内部之前会检查每个对象的存在。
是否存在上述代码的替代方法,以便在所有对象都存在时显示名称。 如果没有,则不应抛出错误。
答案 0 :(得分:0)
检查类似
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");
答案 1 :(得分:0)
使用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 :(得分:0)
尝试
object = {
obj1: {
obj2: {
name: 'MY name'
}
}
}
var name = (object.hasOwnProperty('obj1')) ? object.obj1.obj2.name : object.obj2.name;
console.log(name);
答案 3 :(得分:0)
我建议编写一个递归函数,该函数检查对象并在找到名称的情况下向下递归其子对象。我看到其他人建议捕获该错误-我建议不要针对此类运行时错误滥用异常处理。
答案 4 :(得分:0)
在读取嵌套属性之前,您需要检查每个属性:
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);