代码之家  ›  专栏  ›  技术社区  ›  Lovika

循环递归函数中的json对象

  •  -2
  • Lovika  · 技术社区  · 8 年前

    我想编写一个递归函数来使用javascript迭代json对象。

    我有一个示例json文件:

        {
      "week": [
        [
          {
            "id": "121",
            "amount": 50,
            "numberOfDays": 7,
            "data": {
              "supply": "xyz",
              "price": 50,
            }
          }
        ],
        [
    {
            "id": "122",
            "amount": 30,
            "numberOfDays": 6,
            "data": {
              "supply": "xyz",
              "price": 30,
            }
          }
        ],
      ] 
    }
    

    我想获取json对象数组的每个元素并将其传递给一个函数。

    要提取使用此代码的数组元素,请执行以下操作:

     for(var i=0;i<array[plan].length; i++){
          var confPlan = array[plan][i];
          console.log(plan);
        }
    
    var Bill = function (plan) {
      return func(plan)
      .then((status) => {
        if(status == '1') {
          // do something
        } else if(status == '0') {
          Bill(plan) // but with the next element of the array from the json file
        }
        })
    } 
    

    请帮忙!

    提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Tom user88637    8 年前

    似乎您的问题可以归结为希望能够同步地将调用链接到异步函数。我想 func 是一个异步函数,因为您使用 .then ,所以我用了一个超时来模拟它。以下是递归实现所需行为的一种方法:

    data = {
      "week": [
        [{
          "id": "121",
          "amount": 50,
          "numberOfDays": 7,
          "data": {
            "supply": "xyz",
            "price": 50,
          }
        }],
        [{
          "id": "122",
          "amount": 30,
          "numberOfDays": 6,
          "data": {
            "supply": "xyz",
            "price": 30,
          }
        }],
      ]
    };
    
    function func(data) {
      return new Promise((resolve) => {
        setTimeout(function() {
          console.log(data);
          resolve(0);
        }, 1000)
      })
    }
    
    
    function loop(data, i = 0) {
      if (i < data.length) {
        func(data[i])
          .then((status) => {
            if (status) {
              // do something
            } else {
              return loop.call(null, data, i += 1)
            }
          })
      }
    }
    
    loop(data['week']);

    理想的解决方案包括使用 async/await 迭代地 for 循环。它不仅可以避免递归,而且代码的结构更清晰、更熟悉。不过,我会把这个留给你研究。