以递归方式循环遍历对象(树)

时间:2010-03-30 23:06:46

标签: javascript jquery tree

有没有办法(在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

4 个答案:

答案 0 :(得分:82)

您正在寻找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... 
    }
}

答案 1 :(得分:2)

如果要返回关系树,可以递归使用Object.keys。

$scriptver = "12.0"

答案 2 :(得分:1)

考虑学习object-scan。将头包裹起来后,它对数据处理非常强大。

一件很棒的事情是,这些物品以“删除安全”的顺序遍历。因此,如果删除一个,它不会弄乱循环。您还可以访问许多其他属性,例如父母等。

const objectScan = require('object-scan');

const obj = {
  foo: {
    bar: '',
    child: {
      grand: {
        greatgrand: {
          // and so on
        }
      }
    }
  }
};

objectScan(['**'], {
  filterFn: ({ property }) => {
    console.log(property);
  }
})(obj);
/* =>
greatgrand
grand
child
bar
foo
*/

答案 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(obj[k])
    }
  }
}

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

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

// use this recursive function with a parse funciton
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(obj[k])
    }
  }
}
//***

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