如何检查对象结构是否存在?

Jak*_*son 10 javascript json javascript-objects

让我们说我从第三方源解析一个JSON对象:

var myObject = {
  person_list: [
    { black_hair: {
      list: [
        'bob',
        'john',
        'allen'
      ]}
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

但是,如果结构突然改变或者数据响应可能已损坏,我该如何检查结构的深度部分是否存在?

我可以

if ( myObject.person_list.black_hair.list !== undefined ) {
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

black_hair在某些情况下可能不存在.如果它从对象中丢失,那么我得到一个Uncaught TypeError: Cannot read property 'list' of undefined.因此,我能想到检查整个结构是否完整的唯一方法是检查是否定义了每个级别:

if ( myObject.person_list !== undefined ) {
  if ( myObject.person_list.black_hair !== undefined ) {
    if ( myObject.person_list.black_hair.list !== undefined ) {
      // do stuff
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这有点荒谬.有一种简单的方法可以在JavaScript中处理这个问题吗?是尝试,抓住最好的方法?

Ser*_* A. 4

您可以定义一个函数来检查完整的结构:

function defined_structure(obj, attrs) {

    var tmp = obj;

    for(i=0; i<attrs.length; ++i) {
        if(tmp[attrs[i]] == undefined)
            return false;
        tmp = tmp[attrs[i]];
    }

    return true;
}

//...

if(defined_structure(myObject, ['person_list', 0, 'black_hair', 'list']) {
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

第一个参数是具有要检查的结构的对象,第二个参数是具有嵌套属性名称的数组。

更新:

正如@chiliNUT 所指出的,person_list是一个数组。无论如何,这种方法的工作原理是添加要检查的项目的索引(即['person_list', 0, 'black_hair', 'list'])。