【问题标题】:Javascript - Recursive looping while keeping track of parent child relationshipsJavascript - 在跟踪父子关系的同时进行递归循环
【发布时间】:2018-04-30 16:25:07
【问题描述】:

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

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

例如,我有以下 JSON:

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

最终,我想循环并添加一个名为“级别”的属性(例如 parent1.level)。最上面的父级是0,下一个子级是1等。JSON是动态的,所以没有固定的结构,只是一个复杂的父/子JSON对象。

我可以使用递归函数,但确定每个 JSON 键/val 对的相对级别让我大吃一惊。

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

提前致谢!

【问题讨论】:

  • 把关卡传给递归函数;返回时减少。在开始时传递 0。

标签: javascript json loops underscore.js


【解决方案1】:

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

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

【讨论】:

  • 解决了我的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多