Javascript 使用调用自身的循环函数而不是嵌套循环来迭代数组对象的对象,但会遇到异步问题

Javascript 使用调用自身的循环函数而不是嵌套循环来迭代数组对象的对象,但会遇到异步问题,javascript,Javascript,我有一个名为foods的对象,它包含不同类别的食物作为对象。每个对象“类别”都包含各自类别中的一系列食品。我正在尝试迭代这个过程,创建deal对象,其中包括每个类别中的一种食物。然后,我获取fine对象并将它们存储在名为fines的容器数组中。我的目标是让容器数组包含所有可能的食物组合。我没有编写一系列嵌套循环,而是尝试编写一个自己调用的循环函数,但我认为一些索引值的增量比调用循环函数的速度快,这给了我一些问题 下面的嵌套循环起作用。请注意,fines容器数组在完成时包含100多个fine对象:

我有一个名为
foods
的对象,它包含不同类别的食物作为对象。每个对象“类别”都包含各自类别中的一系列食品。我正在尝试迭代这个过程,创建
deal
对象,其中包括每个类别中的一种食物。然后,我获取
fine
对象并将它们存储在名为
fines
的容器数组中。我的目标是让容器数组包含所有可能的食物组合。我没有编写一系列嵌套循环,而是尝试编写一个自己调用的循环函数,但我认为一些索引值的增量比调用循环函数的速度快,这给了我一些问题

下面的嵌套循环起作用。请注意,
fines
容器数组在完成时包含100多个
fine
对象:

var meals = [];
var meal = {};
var foods = {veggies:["asparagus","broccoli"],meat:["chicken","steak"],dessert:["pudding","ice cream"]};
var keys = Object.keys(foods);

for (var i = 0; i < foods[keys[0]].length; i++) {
    meal[keys[0]] = foods[keys[0]][i];
    for (var j = 0; j < foods[keys[1]].length; j++) {
        meal[keys[1]] = foods[keys[1]][j];
        for (var k = 0; k < foods[keys[2]].length; k++) {
            meal[keys[2]] = foods[keys[2]][k];
            meals.push(JSON.parse(JSON.stringify(meal)));
        }
    }
}
我还注意到,当我获取上面的代码并在
if
语句之前增加
foodTypeNumber
时,我得到了不同的结果。有人能帮我理解这里发生了什么吗

var meals = [];
var meal = {};
var foods = {veggies:["asparagus","broccoli"],meat:["chicken","steak"],dessert:["pudding","ice cream"]};
var keys = Object.keys(foods);

function runLoop(foodTypeNumber) {
    for (var i = 0; i < foods[keys[foodTypeNumber]].length; i++) {
        meal[keys[foodTypeNumber]] = foods[keys[foodTypeNumber]][i];
        foodTypeNumber++;
        if (keys.length > foodTypeNumber) {
            runLoop(foodTypeNumber);
        } else {
            meals.push(JSON.parse(JSON.stringify(meal)));
        }
    }
}

runLoop(0);
var=[];
var-fine={};
var食品={蔬菜:[“芦笋”、“西兰花”]、肉:[“鸡肉”、“牛排”]、甜点:[“布丁”、“冰淇淋”];
var keys=Object.keys(食物);
函数runLoop(foodTypeNumber){
for(var i=0;ifoodTypeNumber){
runLoop(foodTypeNumber);
}否则{
push(JSON.parse(JSON.stringify(fine));
}
}
}
runLoop(0);

这里没有异步代码,所以不,这不是一个异步问题。Tbh实际上是您的原始代码被破坏,生成了太多的组合(包含重复的和空的)。您需要让每个循环转到
foods[keys[…]].length
,而不是
keys[1]。length
“我还注意到,当我在if语句之前获取上面的代码并递增foodTypeNumber时,我会得到不同的结果”-这是因为您在循环中递增,而不是每次函数调用都递增一次。您是正确的,我原来的循环是不正确的,当我没有在循环中递增时,我的函数循环实际上工作正常。
var meals = [];
var meal = {};
var foods = {veggies:["asparagus","broccoli"],meat:["chicken","steak"],dessert:["pudding","ice cream"]};
var keys = Object.keys(foods);

function runLoop(foodTypeNumber) {
    for (var i = 0; i < foods[keys[foodTypeNumber]].length; i++) {
        meal[keys[foodTypeNumber]] = foods[keys[foodTypeNumber]][i];
        foodTypeNumber++;
        if (keys.length > foodTypeNumber) {
            runLoop(foodTypeNumber);
        } else {
            meals.push(JSON.parse(JSON.stringify(meal)));
        }
    }
}

runLoop(0);