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

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

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


慕妹3146593
浏览 1950回答 3
3回答

慕码人2483693

你正在寻找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 objectsfunction eachRecursive(obj){     for (var k in obj)     {         if (typeof obj[k] == "object" && obj[k] !== null)             eachRecursive(obj[k]);         else             // do something...      }}

慕桂英546537

如果要返回关系树,可以递归使用Object.keys。function paths(item) {   function iter(r, p) {     var keys = Object.keys(r);     if (keys.length) {       return keys.forEach(x => iter(r[x], p.concat(x)));     }     result.push([p])   }   var result = [];   iter(item, []);   return result;}var data = {   foo: {     bar: '',     child: {       grand: {         greatgrand: {}       }     }   }}console.log(paths(data));

慕村225694

您可以使用内置的解析函数来创建递归函数。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])     }   }}我使用fooOP 的对象,这里是如何工作的var foo = {   bar:'a',   child:{     b: 'b',     grand:{       greatgrand: {         c:'c'       }     }   }}// use this recursive function with a parse funcitonfunction 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 consoleparseObjectProperties(foo, function(prop) {   console.log(prop)})
打开App,查看更多内容
随时随地看视频慕课网APP