考虑以下Javascript对象
var items = [{
content: 'A_lvl0',
}, {
content: 'B_lvl0',
}, {
content: 'C_lvl0',
children: [{
content: 'C_1_lvl1',
}, {
content: 'C_2_lvl1',
children: [{
content: 'C_1_lvl2'
}, {
content: 'C_2_lvl2',
children:[{
content: 'C_1_lvl3'
}, {
content: 'C_2_lvl3'
}]
}]
}, {
content: 'C_3_lvl1'
}]
}];
你在对象的content属性中看到的lvlx,其中x表示对象嵌套的深度,假设我对上面对象内部的对象有一个引用,并希望返回x的值,即对象的深度是嵌套的,我知道我必须使用递归,但我不知道如何跟踪顶级lvl
我能够使用以下函数打印所有对象的嵌套内容
var scanObj = function (obj) {
for (var i = 0; i < obj.length; i++) {
console.log(obj[i].content);
if (obj[i].hasOwnProperty('children')) {
scanObj(obj[i].children);
}
}
};
但现在我想写的是
var getlvlByRef = function (obj,subobject) {
//return lvl
};
var getlvlByPropertyValue = function (obj,propertyname,propertyvalue) {
//return lvl
};
我的问题是我不知道当我到达最后一个嵌套的lvl时如何跟踪,你能指出我正确的方法吗?
这是一个小提琴http://jsfiddle.net/eG3qR/
答案 0 :(得分:2)
在这里,我为我的解决方案创造了一个小提琴
function getlvlByPropertyValue(obj, propertyName, propertyValue, level){
if(level == undefined) level = 0;
if(obj == undefined || obj.length == 0) return -1;
for(var i = 0;i < obj.length; i++){
var curObj = obj[i];
if(curObj[propertyName] != undefined && curObj[propertyName] == propertyValue) {
return level;}
if(curObj["children"] != undefined){
var childSearchResult = getlvlByPropertyValue(curObj["children"], propertyName, propertyValue, ++level);
if(childSearchResult > 0) {
return childSearchResult;
}
}
}
return -1;
}
如果没有找到,它将返回-1。
答案 1 :(得分:1)
如果您希望scanObj打印出您当前的级别,可以将级别传递给scanObj
这样:
var scanObj = function (obj, level, init) {
if (level === undefined || init) {
level = 0;
}
for (var i = 0; i < obj.length; i++) {
console.log(obj[i].content);
console.log(level);
if (obj[i].hasOwnProperty('children')) {
scanObj(obj[i].children, level);
}
}
};
scanObj(myObj, 0, true);
可能会被清除,因此您不需要init标志,但这应该打印obj内容以及对象所处的级别。