Javascript - 在跟踪父子关系的同时递归循环

时间:2018-04-30 16:25:07

标签: javascript json loops underscore.js

使用Javascript (Underscore也是一个可行的解决方案),我如何遍历可以深入多个对象的复杂JSON对象(无数组)。

如何循环访问JSON对象并跟踪我所在的父/子层次结构中的哪个级别?

例如,我有以下JSON:

{
    'parent1': {
        'name': 'something',
        'children': {
            'name': 'something else'
        }
    },
    'parent2': {
        'name': 'something',
        'children': {
            'name': 'something else',
            'anotherProp': {
                'name': 'whoa..something else'
            }
        }
    },
}

最终,我想循环并添加一个名为'level'(例如parent1.level)的属性。顶级父级别为 0 ,下一个子级别为 1 等.JSON是动态的,因此没有设置结构,只是它是一个复杂的父/子JSON对象

我对递归函数很好,但是确定每个JSON键/值对的相对级别会让我感到沮丧。

如果需要更多信息,请告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:2)

你应该能够简单地使用一个带有对象和级别的函数来递归:

var obj = {'parent1': {'name': 'something','children': {    'name': 'something else'}},'parent2': {'name': 'something','children': {'name': 'something else','anotherProp': { 'name': 'whoa..something else'}}},}

function recurse(obj, level=0){
    // add level
    obj.level = level
    Object.values(obj).map(v =>{
        if (typeof v === 'object') {
            // call again on children with increased level
            recurse(v, level+1)
        }
    })
}

recurse(obj)
console.log(obj)

如果您不希望这是一个递归函数,您可以使用经典的广度优先搜索添加级别。类似的东西:

var obj = {'parent1': {'name': 'something','children': {    'name': 'something else'}},'parent2': {'name': 'something','children': {'name': 'something else','anotherProp': { 'name': 'whoa..something else'}}},}

function addLevel(obj){
    obj.level = 0
    // will be FIFO queue
    let queue = [obj]
    while(queue.length){
        let o = queue.shift();
        Object.values(o).forEach(item => {
            if (typeof item === 'object'){ 
                // level will be one more than parent
                item.level = o.level +1
                queue.push(item)
            }
        });
    }
}

addLevel(obj)
console.log(obj)

我不确定你的level: 0是从对象的根或第一个父对象开始,但这是一个简单的调整。两者都假设原始对象是树(即没有循环引用)。如果有循环引用,则需要跟踪您看到的对象。