javascript - 对于嵌套在彼此内部的循环
问题描述
我正在尝试编写一个脚本,它将返回某些参数的所有可能组合。这是我目前拥有的。问题是 tagsLoop 列表的长度可以改变,然后我需要在最嵌套的循环中再进行一个 for 循环。然后又一个又一个。我正在添加带有用于循环的变量的屏幕截图。
编辑:添加工作片段
var tagsLoop = ["mobile_size", "desktop_size", "tag_test"]
var bigArray = [{tag: "mobile_size", key: "size", val: "6"},
{tag: "mobile_size", key: "size", val: "2"},
{tag: "desktop_size", key: "size", val: "10"},
{tag: "desktop_size", key: "size", val: "20"},
{tag: "tag_test", key: "oracle", val: ""},
{tag: "tag_test", key: "pros", val: ""}]
for (var i = 0; i < bigArray.length; i++) {
if (bigArray[i]['tag'] == tagsLoop[0]) {
var part1 = bigArray[i]['key'] + '=' + bigArray[i]['val']
for (var j = 0; j < bigArray.length; j++) {
if (bigArray[j]['tag'] == tagsLoop[1]) {
var part2 = "&" + bigArray[j]['key'] + '=' + bigArray[j]['val']
for (var k = 0; k < bigArray.length; k++) {
if (bigArray[k]['tag'] == tagsLoop[2]) {
var part3 = "&" + bigArray[k]['key'] + '=' + bigArray[k]['val']
console.log(part1, part2, part3)
}
}
}
}
}
}
解决方案
您可以先获取分组数据,然后使用所需项目及其值的组合构建新数组。
function getCartesian(array, keys) {
var temp = array.reduce((r, { tag, key, val }) => {
(r[tag] = r[tag] || []).push([key, val].join('='));
return r;
}, Object.create(null));
return keys
.map(k => temp[k])
.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []))
.map(a => a.join('&'));
}
var array = [{ tag: "mobile_size", key: "size", val: "6" }, { tag: "mobile_size", key: "size", val: "2" }, { tag: "desktop_size", key: "size", val: "10" }, { tag: "desktop_size", key: "size", val: "20" }, { tag: "tag_test", key: "oracle", val: "" }, { tag: "tag_test", key: "pros", val: "" }],
tags = ["mobile_size", "desktop_size", "tag_test"],
result = getCartesian(array, tags);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- alpine.js - Alpine.Js - 使用动态支持将两个输入列相乘
- symfony - 使用 DQL 从 Symfony 中的 3 个字段中获取数据
- wifi - Mesh-wifi:如果 RSSI 低于阈值,则更改父级
- python - 将文件下载到默认位置 selenium python
- javascript - 是的,验证输入依赖
- beagleboneblack - 首次使用时无法通过串行 uart 电缆、登录名和密码向 BeagleBone 发送数据,但它通过 minicom 接收日志消息
- node.js - 通过 Postman Form-Data 在节点 js 中处理发布数据/图像的简单方法
- java - 找不到方法'com.android.build.gradle.tasks.factory.AndroidJavaCompile.setDependencyCacheDir
- python - 带有垃圾收集的 Python 惰性计算
- amazon-web-services - HTTP 连接拒绝 AWS EC2 实例