递归地遍历一个对象(树)

新手上路,请多包涵

有没有一种方法(在 jQuery 或 JavaScript 中)遍历每个对象及其子对象和孙对象等等?

如果是这样…我也可以读出他们的名字吗?

例子:

 foo :{
  bar:'',
  child:{
    grand:{
      greatgrand: {
        //and so on
      }
    }
  }
}

所以循环应该做这样的事情……

 loop start
   if(nameof == 'child'){
     //do something
   }
   if(nameof == 'bar'){
     //do something
   }
   if(nameof =='grand'){
     //do something
   }
loop end

原文由 Val 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 299
2 个回答

您正在寻找 for...in 循环:

 for (var key in foo)
{
    if (key == "child")
        // do something...
}

请注意 for...in 循环将遍历任何可枚举属性,包括添加到对象原型的属性。为避免作用于这些属性,您可以使用 hasOwnProperty 方法来检查该属性是否仅属于该对象:

 for (var key in foo)
{
    if (!foo.hasOwnProperty(key))
        continue;       // skip this property
    if (key == "child")
        // do something...
}

递归执行循环就像编写递归函数一样简单:

 // This function handles arrays and objects
function eachRecursive(obj)
{
    for (var k in obj)
    {
        if (typeof obj[k] == "object" && obj[k] !== null)
            eachRecursive(obj[k]);
        else
            // do something...
    }
}

原文由 Andy E 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以拥有一个递归函数,其中内置一个解析函数。

 function parseObjectProperties (obj, parse) {
  for (var k in obj) {
    if (typeof obj[k] === 'object' && obj[k] !== null) {
      parseObjectProperties(obj[k], parse)
    } else if (obj.hasOwnProperty(k)) {
      parse(k, obj[k])
    }
  }
}

我使用 foo OP 的对象,这里是它的工作原理

 var foo = {
  bar:'a',
  child:{
    b: 'b',
    grand:{
      greatgrand: {
        c:'c'
      }
    }
  }
}

// use this recursive function with a parse function
function parseObjectProperties (obj, parse) {
  for (var k in obj) {
    if (typeof obj[k] === 'object' && obj[k] !== null) {
      parseObjectProperties(obj[k], parse)
    } else if (obj.hasOwnProperty(k)) {
      parse(k, obj[k])
    }
  }
}
//***

// then apply to the property the task you want, in this case just console
parseObjectProperties(foo, function(k, prop) {
  console.log(k + ': ' + prop)
})

原文由 João Pimentel Ferreira 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏