如何启用javascript循环以递归方式迭代未知次数?

时间:2017-10-13 21:57:36

标签: javascript loops design-patterns

我遇到了一些我在javascript中不熟悉的问题。我猜测解决这类问题可能是一种直截了当的方法,但我不清楚它可能是什么。

  • 我有一个包含一系列对象的数组。
  • 这些对象中的每一个都可能(或可能不)包含一个包含一系列对象的更深层数组。
  • 每个那些对象可能(或可能不)包含一个包含一系列对象的更深层数组
  • (依此类推......)

我需要处理每个对象系列中的每个对象,因此编写一个运行function的{​​{1}},我可以反复调用它似乎是显而易见的方法。

但是......(这是问题)...因为函数可能会重复调用本身,所以如何编写一个循环来深入到对象中,如同深它需要吗?

这是一个例子......

使用此对象:

for loop

我可以使用这个嵌套循环以正确的顺序记录值:

{
  "level1": [
    {
      "FirstItem": "one",
      "SecondItem": "two",
      "ThirdItem": [
        {
          "FirstItem": "three",
          "SecondItem": "four"
        }
      ]
    },
    {
      "FirstItem": "five",
      "SecondItem": "six",
      "ThirdItem": [
        {
          "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]);
                    }
                }
            }
        }
    }
}

但是......循环绝对可怕。这是冗长而丑陋的。并且,如果需要更深入地了解对象,那么它究竟会如何提出迭代器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]); } } } } } }mno?< / p>

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

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

2 个答案:

答案 0 :(得分: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]);
        }
    }
}

答案 1 :(得分:1)

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