在递归函数中循环遍历json对象

时间:2018-08-06 09:43:29

标签: javascript json recursion

我想编写一个递归函数,以使用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 个答案:

答案 0 :(得分:0)

似乎您的问题归结为希望能够将调用同步链接到异步函数。我假设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。它不仅可以避免递归,而且代码的结构更简洁,更熟悉。但是,我留给您研究。