2017-10-13 60 views
0

我已经在JavaScript中遇到过一些我不熟悉的问题。我猜测可能有一种简单的方法来解决这类问题,但我不清楚它可能是什么。如何启用JavaScript循环递归迭代未知次数?

  • 我有一个包含一系列对象的数组。
  • 这些对象中的每一个都可能(或可能不)包含一个包含一系列对象的较深的数组。
  • 每个那些对象可以(或可以不)包含其中含有
  • 一系列对象的更深的阵列(等等...)

我需要处理在每个每个对象一系列的对象,所以写一个function其中运行一个for loop,我可以反复调用似乎是明显的方法。

但是...(这里的问题)......因为函数可以调用本身次重复的次数,我怎么能写一个循环不断深入到对象,深,因为它需要?

下面是一个例子...

有了这个对象:

for (var i = 0; i < Object.keys(myObject.level1).length; i++) { 

    for (var j = 0; j < (Object.values(myObject.level1[i]).length); j++) { 

     if (typeof Object.values(myObject.level1[i])[j] === 'string') { 
      console.log(Object.values(myObject.level1[i])[j]); 
     } 

     else { 

      for (var k = 0; k < Object.values(myObject.level1[i])[j].length; k++) { 

       for (var l = 0; l < (Object.values(Object.values(myObject.level1[i])[j][k]).length); l++) { 

        if (typeof Object.values(Object.values(myObject.level1[i])[j][k])[l] === 'string') { 
        console.log(Object.values(Object.values(myObject.level1[i])[j][k])[l]); 
        } 
       } 
      } 
     } 
    } 
} 

证明:

{ 
    "level1": [ 
    { 
     "FirstItem": "one", 
     "SecondItem": "two", 
     "ThirdItem": [ 
     { 
      "FirstItem": "three", 
      "SecondItem": "four" 
     } 
     ] 
    }, 
    { 
     "FirstItem": "five", 
     "SecondItem": "six", 
     "ThirdItem": [ 
     { 
      "FirstItem": "seven", 
      "SecondItem": "eight" 
     } 
     ] 
    } 
    ] 
} 

我能以正确的顺序使用该嵌套循环日志值

var myObject = {}; 
 
myObject['level1'] = []; 
 

 
myObject.level1[0] = {FirstItem: 'one', SecondItem: 'two'}; 
 
myObject.level1[0]['ThirdItem'] = []; 
 

 
myObject.level1[1] = {FirstItem: 'five', SecondItem: 'six'}; 
 
myObject.level1[1]['ThirdItem'] = []; 
 

 
myObject.level1[0].ThirdItem[0] = {FirstItem: 'three', SecondItem: 'four'}; 
 
myObject.level1[1].ThirdItem[0] = {FirstItem: 'seven', SecondItem: 'eight'}; 
 

 
for (var i = 0; i < Object.keys(myObject.level1).length; i++) { 
 

 
    for (var j = 0; j < (Object.values(myObject.level1[i]).length); j++) { 
 

 
     if (typeof Object.values(myObject.level1[i])[j] === 'string') { 
 
      console.log(Object.values(myObject.level1[i])[j]); 
 
     } 
 
    
 
     else { 
 
      
 
      for (var k = 0; k < Object.values(myObject.level1[i])[j].length; k++) { 
 
        
 
       for (var l = 0; l < (Object.values(Object.values(myObject.level1[i])[j][k]).length); l++) { 
 

 
        if (typeof Object.values(Object.values(myObject.level1[i])[j][k])[l] === 'string') { 
 
        console.log(Object.values(Object.values(myObject.level1[i])[j][k])[l]); 
 
        } 
 
       } 
 
      } 
 
     } 
 
    } 
 
}

但是...循环绝对是可怕的。它是冗长而丑陋的。而且,如果它需要深入到对象中,它究竟会如何提出迭代器m,n,op

我猜测另一种类型的循环(如whiledo... while)可能是一种更好的方法,但我不清楚javascript如何确定对象的深度。

最终,我猜测这只是一个我不熟悉的模式的例子,而且我使用错误的工具笨拙地产生了正确的结果。

+2

简单的答案是“使用递归函数” - 即。 https://www.sitepoint.com/recursion-functional-javascript/每次递归调用都会收到一个不同的对象/集合(前一个/父级调用的“根”对象的子元素之一)。 – user2864740

回答

3
function printValues(inputObj) { 
    for (var key in inputObj) { 
     if (Array.isArray(inputObj[key])) { 
      inputObj[key].forEach(function(currentObj) { 
       printValues(currentObj); 
      }); 
     } else { 
      console.log(inputObj[key]); 
     } 
    } 
} 
+0

非常棒,@Andrea - 非常令人印象深刻。 '阵列。isArray()'对我来说是新的;我知道'for for循环中枚举'objects',尽管我仍然试图解决它,并且我熟悉'forEach'。你写了一个非常简洁和优雅的功能 - 正是我试图建立的那种东西。谢谢。 – Rounin

1

这本质上是一个树(数据结构)。树由父节点和子节点组成。每个节点都有一个值,有些节点有一个子属性,它是其他节点的数组。我希望这个链接有帮助,https://en.wikipedia.org/wiki/Tree_traversal