2015-09-11 211 views
1

我有一個for循環應循環通過一個對象。但是這個對象可以有很多其他的對象層次。我怎樣才能在for循環內生成for循環的函數?for循環裏面的for循環函數在javascript中

像這樣的事情,那裏的lvl變量是應該在下潛的級別數:

var lvl = 5; 

for (var i = 0; i < groups.length; i++) { 
    var groups = groups[i]; 

    for (var i = 0; i < groups.length; i++) { 
     var groups = groups[i]; 

     for (var i = 0; i < groups.length; i++) { 
      var groups = groups[i]; 

     } 
    } 
} 

舉例來說,如果我有以下對象樹:

var foo = { 
    child: { 
    grand:{ 
     greatgrand: { 
     } 
    } 
    } 
} 

哪有我只是通過跳到foo對象中的特定級別來記錄所有對象樹名稱?

dive(2); // would dive to level two (grand) 

// would return the following in the console 
child 
grand 
+5

你應該看看 – Jan

+0

你需要不同的變量對每個嵌套'for'循環,這樣一個循環不是從別人覆蓋變量或者你可以做一個函數的遞歸函數做循環並遞歸地調用它。 – jfriend00

+0

你有數組或對象嗎? – epascarello

回答

2

在這裏,你去。我已經編寫了一個遞歸函數來迭代一個對象圖。您可以爲遍歷函數提供深度參數。

JSFiddle是here。請檢查開發者工具控制檯的輸出。
添加了縮進小提琴是here

var obj = { 
firstName: "John", 
lastName: "Doe", 
address1A: { 
    street: "120 Washington St", 
    city: "Mountain View", 
    state: "CA", 
    address2A: { 
     street: "100 Washington st", 
     city: "Mountain View", 
     state: "CA", 
     address3A: { 
      street: "150 Washington st", 
      city: "Mountain View", 
      state: "CA", 
      address4A: { 
       street: "150 Washington st", 
       city: "Mountain View", 
       state: "CA", 
      } 
     } 
    } 
}, 
address1B: { 
    street: "120 Washington St", 
    city: "Mountain View", 
    state: "CA", 
    address2B: { 
     street: "100 Washington st", 
     city: "Mountain View", 
     state: "CA", 
     address3B: { 
      street: "150 Washington st", 
      city: "Mountain View", 
      state: "CA", 
      address4B: { 
       street: "150 Washington st", 
       city: "Mountain View", 
       state: "CA", 
      } 
     } 
    } 
} 
}; 

function traverse(initObj, depth) { 
    depthTraversal(initObj, depth, 1); 
} 

function depthTraversal(objArg, depthArg, counterArg) { 
    //create a closure for remembering loop variables 
    return (function (myObj, myDepth, counter) { 
     //console.log(myDepth + " - " + counter); 
     if (myDepth < counter) { 
      return; 
     } 
     //console.log(myObj); 
     for (var prop in myObj) { 
      //console.log(prop + " :" + typeof (myObj[prop])); 
      if (myObj.hasOwnProperty(prop)) { 
      if (typeof (myObj[prop]) === "object") { 
       console.log(prop); 
       depthTraversal(myObj[prop], myDepth, counter + 1); 
      } 
      } 
     } 
}(objArg, depthArg, counterArg)); //IIFE 
}; 


traverse(obj, 4); 
+0

謝謝,我會審查你的解決方案,以更好地理解如何使用這:) – gespinha

2

遞歸函數 - 調用自身的函數 - 是要走的路。你會想要這樣的事情:

/* pseudo-code; this will not run */ 
function processThing(thing) { 
    if (thing is an object) { 
    // process all of thing's properties 
    for (property in thing) { 
     processThing(property); 
    } 
    } 
    else { 
    // process thing as a value 
    } 
}