在javascript中,测试属性是否深深嵌套在对象图中?

thi*_*ame 4 javascript properties graph object

我从CouchDB数据库中获得了一组完全不同的复杂JSON对象.每个都包含许多级别的嵌套属性 - 例如,

tps_report.personnel_info.productivity.units_sold = 8  
Run Code Online (Sandbox Code Playgroud)

我想迭代这些对象并用它们做些事情:例如,

// writes units sold from each TPS report:
for (i in tpsReports) {
  if (tpsReports[i].personnel_info.productivity.units_sold < 10) {
    fireEmployee();
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是许多TPS报告没有设置所有这些属性.因此,如果我尝试这个,我将在第一次循环到达没有"personnel_info"属性的报告时出现错误,从而尝试找到"未定义"的"生产力"属性.我宁愿发生的是条件只是跳过它并继续.

我看到了两种方法,这两种方式对我来说都很难看

  1. 使用嵌套条件分别测试每个属性
  2. 将该行括在try/catch块中以捕获错误并忽略它

我更喜欢的是PHP的isset()函数,它不会抛出错误,无论你提供什么 - 它只会告诉你你正在寻找的特定变量是否存在.所以,就像

// writes units sold from each TPS report:
for (i in tpsReports) {
  if (isset(tpsReports[i].personnel_info.productivity.units_sold)){
    if (tpsReports[i].personnel_info.productivity.units_sold < 10) {
      fireEmployee();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Zac*_*ach 5

function isset(obj, propStr) {
    var parts = propStr.split(".");
    var cur = obj;
    for (var i=0; i<parts.length; i++) {
        if (!cur[parts[i]])
            return false;
        cur = cur[parts[i]];
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

请注意,第二个参数是字符串,因此在访问不存在的属性上的属性时不会抛出异常.