javascript - 使用调用自身的循环函数而不是嵌套循环来遍历数组对象的对象,但会遇到异步问题
问题描述
我有一个名为的对象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);
解决方案
推荐阅读
- java - Maven 在 Maven 安装目标期间找不到 assertEquals 符号
- r - 在R中使用apply或map函数时如何将列名传递给函数?
- amazon-dynamodb - DynamoDB 版本是否不可知
- php - 继续登录会话 Fuel
- sql - 如何将列中的单个文本转换为sql中的行?
- azure-cloud-services - Azure Database for MYSQL 频繁连接失败
- flutter - 如何发送信息在颤动中抛出深层链接
- asp.net-core - 如何在布局图标中显示购物车项目
- python - 对同一文件夹中的文件进行并行处理
- reactjs - × TypeError:无法读取 null 的属性“名称”