我想编写一个递归函数,以使用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
}
})
}
请帮助!
谢谢。
答案 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
。它不仅可以避免递归,而且代码的结构更简洁,更熟悉。但是,我留给您研究。