javascript - 如何使 JavaScript 循环递归地迭代未知次数?

标签 javascript loops design-patterns

我在 javascript 中遇到了一种我不熟悉的问题。我猜测可能有一种简单的方法可以解决此类问题,但我不清楚它可能是什么。

  • 我有一个包含一系列对象的数组。
  • 每个对象可能(或可能不)包含一个更深的数组,该数组包含一系列对象。
  • 每个这些对象可能(或可能不)包含一个更深的数组,该数组包含一系列对象
  • (等等...)

我需要处理每个对象系列中的每个对象,因此编写一个运行我可以重复调用的for循环函数似乎是显而易见的方法。

但是...(这里是问题)...由于函数可能会重复多次调用本身,我怎样才能编写一个不断深入对象的循环,尽可能深因为它需要吗?

这是一个例子...

对于这个对象:

{
  "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]);
                    }
                }
            }
        }
    }
}

但是......这个循环绝对是可怕的。它冗长且丑陋。而且,如果需要更深入地了解对象,那么它到底如何得出迭代器 mnop

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

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

最佳答案

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]);
        }
    }
}

关于javascript - 如何使 JavaScript 循环递归地迭代未知次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738555/

相关文章:

design-patterns - 游戏脚本设计模式

javascript - Mocha 单元测试运行缓慢

javascript - CoffeeScript 中的 function.call

loops - F# 类型和循环

java - 在 Java 中使用循环优化 if 语句

c++ - 如何选择一个类来动态实例化?

javascript - Firebase Cloud Function 错误,函数返回未定义、预期 Promise 或值

javascript - 无法使用 iCheck 选择复选框 - HTML 复选框

javascript - 在循环迭代时保留 JavaScript 数组中的双引号

c# - MVVM 中的双向数据绑定(bind)问题