首页 > 解决方案 > 使用调用自身的循环函数而不是嵌套循环来遍历数组对象的对象,但会遇到异步问题

问题描述

我有一个名为的对象foods,其中包含不同类别的食物作为对象。这些对象“类别”中的每一个都包含它们各自类别中的一系列食品。我正在尝试遍历此内容,创建meal包含每个类别中的一个食品的对象。然后我获取meal对象并将它们存储在一个名为meals. 我的目标是让容器数组包含所有可能的食物组合。我没有编写一系列嵌套循环,而是尝试编写一个调用自身的循环函数,但我认为某些索引值的增加速度比调用循环函数的速度快,这给我带来了问题。

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

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

这(下)是我尝试使用循环函数的方式,但它不起作用,因为meals容器数组包含的数量远远少于完成后可能的组合数。有没有办法使用回调、承诺或其他东西来完成这样的工作?

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];
        if (keys.length > foodTypeNumber + 1) {
            runLoop(foodTypeNumber + 1);
        } else {
            meals.push(JSON.parse(JSON.stringify(meal)));
        }
    }
}

runLoop(0);

我还注意到,当我使用上面的代码并foodTypeNumber在语句之前递增时if,我得到了不同的结果。有人可以帮我理解这里发生了什么吗?

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

标签: javascript

解决方案


推荐阅读