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