[英]for loop inside for loop function in javascript
我有一個for
循環,應該循環通過一個對象。 但是此對象內部可以具有許多其他對象級別。 我怎樣才能使一個功能,應該讓for
循環內for
循環,因為我想為多層次的深淵?
像這樣, 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
遞歸函數(一個可以自我調用的函數)是解決之道。 您想要這樣的東西:
/* 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
}
}
干得好。 我已經編寫了一個遞歸函數,它將迭代一個對象圖。 您可以為遍歷函數提供depth參數。
一個JSFiddle在這里 。 請檢查開發者工具控制台的輸出。
帶有縮進的小提琴在這里
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.