Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中获取对象的子对象的子对象。(如有)_Javascript_Arrays_Json - Fatal编程技术网

如何在javascript中获取对象的子对象的子对象。(如有)

如何在javascript中获取对象的子对象的子对象。(如有),javascript,arrays,json,Javascript,Arrays,Json,我得到一些json数据,在那里我有这样一个结构: 'modules' : { 'category1' : { 'section1' : { 'page1' : [ 'module1', 'module2' ] }, 'section2' : { 'page1' : [ 'module1' ] } }, // and so on } 我需要得到一些页面的所有

我得到一些json数据,在那里我有这样一个结构:

'modules' : {
    'category1' : {
        'section1' : {
             'page1' : [ 'module1', 'module2' ]
        },
        'section2' : {
             'page1' : [ 'module1' ]
        }
    },
    // and so on
}
我需要得到一些页面的所有模块

输入参数为类别、节和页

所以我需要获得模块[类别][部分][页面]

但是,如果没有用于此类部分或页面的模块,该怎么办

    // m = getAllModules();

    if ( m.hasOwnProperty(category) ) {
        if ( m[category].hasOwnProperty(section) ) {
            if (m[category][section].hasOwnProperty(page)) {
                concrete = m[category][section][page];
            }
        }
    }

如何优化这个脚本?有很多m[]的电话。有更好的方法吗?

您可以这样做:

var categories, sections;    
if ((categories = modules[categoryName]) && (sections = categories[sectionName])) {
  concrete = sections[pageName] || [];
}
else {
  concrete = [];
}
concrete = traverse(modules, categoryName, sectionName, pageName) || [];
您还可以创建更通用的解决方案:

function traverse(source) {
  var path = Array.prototype.slice.call(arguments, 1);
  var current = source;
  for (var i = 0, l = path.length; i < l; ++i) {
    current = current[path[i]];
    if (!current) break; 
  }
  return current;
}

你可以这样做:

var categories, sections;    
if ((categories = modules[categoryName]) && (sections = categories[sectionName])) {
  concrete = sections[pageName] || [];
}
else {
  concrete = [];
}
concrete = traverse(modules, categoryName, sectionName, pageName) || [];
您还可以创建更通用的解决方案:

function traverse(source) {
  var path = Array.prototype.slice.call(arguments, 1);
  var current = source;
  for (var i = 0, l = path.length; i < l; ++i) {
    current = current[path[i]];
    if (!current) break; 
  }
  return current;
}

嗯,你可以让它成为一个递归函数,尽管那可能会慢一些。不过,它更容易理解,而且可以重用

function getFromJSON(object, listOfPropertyNames) {
   if (listOfPropertyNames.length == 0 || object == undefined) {
      return object;
   }
   var propertyToFind = listOfPropertyNames[0];
   if (object.hasOwnProperty(propertyToFind)) {
      return getFromJSON(object[propertyToFind], listOfPropertyNames.slice(1));
   }
}

concrete = getFromJSON(m, ['category','section','page'])

嗯,你可以让它成为一个递归函数,尽管那可能会慢一些。不过,它更容易理解,而且可以重用

function getFromJSON(object, listOfPropertyNames) {
   if (listOfPropertyNames.length == 0 || object == undefined) {
      return object;
   }
   var propertyToFind = listOfPropertyNames[0];
   if (object.hasOwnProperty(propertyToFind)) {
      return getFromJSON(object[propertyToFind], listOfPropertyNames.slice(1));
   }
}

concrete = getFromJSON(m, ['category','section','page'])

考虑为此设置一个实用功能:

function grab( val, names ) {
    names = names.split( '.' );    
    while ( val && names.length ) { val = val[ names.shift() ]; }    
    return val;
}
用法:

grab( m, 'category1.section1.page1' ) // returns [ 'module1', 'module2' ]
grab( m, 'category7.section1.page1' ) // returns undefined

现场演示:

考虑为此设置实用程序功能:

function grab( val, names ) {
    names = names.split( '.' );    
    while ( val && names.length ) { val = val[ names.shift() ]; }    
    return val;
}
用法:

grab( m, 'category1.section1.page1' ) // returns [ 'module1', 'module2' ]
grab( m, 'category7.section1.page1' ) // returns undefined
现场演示: