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

时间:2019-03-13 10:20:43

标签: javascript reactjs

对象结构如下。

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

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

因此,在反应中,您将像编写代码。

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

这样,仅当存在object,obj1和obj2时,才会显示obj2.name。

  

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

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

5 个答案:

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