2013-05-12 67 views
0

我已经声明了一个三重嵌套的对象,像这样:循环通过三嵌套对象在Javascript

var food = { 
    "fruit": { 
     "apples": { 
      "redApples": 20, 
      "greenApples": 30 
     }, 
     "bananas": { 
      "yellowBananas": 10 
     } 
    }, 
    "grains": { 
     "bread": { 
      "brownBread": 50 
     } 
    } 
}; 

我发现this question,它的工作,通过对象的对象迭代,但我坚持。我将如何遍历这个对象?

更新:对于这个特定的问题,嵌套的for循环会工作得很好,像这样:

for(var key in food) 
    for(var prop in food[key]) 
     for(var foo in food[key][prop]) 
      console.log(food[key][prop][foo]); 

不过,也有一些很好的递归函数下面这将无限期嵌套对象做到这一点。

+5

将代码放入一个递归调用自身的函数中。 – 2013-05-12 14:55:58

+0

您需要一个抽象解决方案(适用于“无限”嵌套对象)或简单地说明如何迭代此特定对象中的所有键/值? – sixFingers 2013-05-12 15:02:02

+0

刚刚使用嵌套循环时出现了什么问题(您需要比您找到的问题更多的级别)。由于它不是无限嵌套的,而只有3个层次,所以不需要递归。 – Bergi 2013-05-12 15:42:58

回答

4

马丁是对的,递归函数就是这个方法。你的函数应该检查的是属性的一个对象。如果是这样的话 - 函数必须通过自己调用来更深入地行走,但是使用嵌套对象。

function recursiveIter(obj){ 
    for (var i in obj){ 
     if (typeof obj[i]=="object"){ 
      recursiveIter(obj[i]); 
     } 
     else { 
      $('.ins').append(obj[i]); // or what do you want to do with that   
     } 
    } 
} 

recursiveIter(food); 

jsfiddle用这种方法。

1

您可以创建一个接受对象和回调的通用函数,然后执行递归调用。

function objectWalk (obj, callback){ 
    for(o in obj){ 
     if(typeof obj[o] === 'object'){ 
      objectWalk(obj[o], callback); 
     }else { 
      callback(obj[o]); 
     } 
    } 
} 

我在这里做的是循环浏览对象并检查循环中的每个项目是否是一个对象。如果是,请再次调用相同的函数。如果不是,则将对象的值传递给回调。它是一个方便的小功能。

看到它在行动here