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

Getting a number that represents the level of an object/nested object inside an object

本文关键字:对象 数字 表示 获取 嵌套      更新时间:2023-09-26

考虑以下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的值,即对象嵌套的深度,我知道我必须使用递归,但我不确定如何跟踪顶层的

可以使用以下函数

打印所有对象的嵌套内容
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
    };

和我的问题是我不知道如何保持跟踪当我到达最后一个嵌套的水平,你能告诉我正确的方式吗?

这里有一个小提琴http://jsfiddle.net/eG3qR/

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

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

如果你想让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标志,但这应该打印对象内容以及对象所在的级别。