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

Javascript - Recursive looping while keeping track of parent child relationships

使用Javascript (下划线也是一种可行的解决方案),如何循环遍历一个复杂的JSON对象(无数组)可以深入几个物体。

如何遍历 JSON 对象并跟踪我在 parent/child 层次结构中的哪个级别?

例如,我有以下 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 是动态的,因此没有固定结构,只是它是一个复杂的 parent/child JSON 对象。

我对递归函数没问题,但是确定每个 JSON key/val 对的相对水平让我感到困惑。

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

提前致谢!

您应该能够简单地使用带有对象和级别的函数进行递归:

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 是从对象的根还是第一个父对象开始,但这是一个简单的调整。两者都假设原始对象是一棵树(即没有循环引用)。如果有循环引用,您将需要跟踪您看到的对象。