获取一个数字,表示对象内对象/嵌套对象的级别

时间:2014-03-21 20:22:43

标签: javascript

考虑以下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/

2 个答案:

答案 0 :(得分:2)

在这里,我为我的解决方案创造了一个小提琴

http://jsfiddle.net/3W5qY/3/

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内容以及对象所处的级别。