javascript - 将 3 层数组映射到对象集合
问题描述
我正在努力获得 3 层数组分组以正确映射到单个对象集合,其中每一层作为对象的键名,数组值作为键值。
这三个数组按层相互关联,结构如下:
{
tier1: ['tier1-item1', 'tier1-item2'],
tier2: ['tier2-item1', 'tier2-item2', 'tier2-item3', 'tier2-item4', 'tier2-item5'],
tier3: ['tier3-item1', 'tier3-item2', 'tier3-item3']
}
它们需要产生如下的对象数组:
[
{tier1: "tier1-item1", tier2: "tier2-item1", tier3: "tier3-item1"},
{tier1: "tier1-item1", tier2: "tier2-item2", tier3: "tier3-item1"},
{tier1: "tier1-item1", tier2: "tier2-item3", tier3: "tier3-item1"},
{tier1: "tier1-item1", tier2: "tier2-item4", tier3: "tier3-item1"},
{tier1: "tier1-item1", tier2: "tier2-item5", tier3: "tier3-item1"},
{tier1: "tier1-item2", tier2: "tier2-item1", tier3: "tier3-item1"},
{tier1: "tier1-item2", tier2: "tier2-item2", tier3: "tier3-item1"},
{tier1: "tier1-item2", tier2: "tier2-item3", tier3: "tier3-item1"},
{tier1: "tier1-item2", tier2: "tier2-item4", tier3: "tier3-item1"},
{tier1: "tier1-item2", tier2: "tier2-item5", tier3: "tier3-item1"},
{tier1: "tier1-item1", tier2: "tier2-item1", tier3: "tier3-item2"},
{tier1: "tier1-item1", tier2: "tier2-item2", tier3: "tier3-item2"},
{tier1: "tier1-item1", tier2: "tier2-item3", tier3: "tier3-item2"},
{tier1: "tier1-item1", tier2: "tier2-item4", tier3: "tier3-item2"},
{tier1: "tier1-item1", tier2: "tier2-item5", tier3: "tier3-item2"},
{tier1: "tier1-item2", tier2: "tier2-item1", tier3: "tier3-item2"},
{tier1: "tier1-item2", tier2: "tier2-item2", tier3: "tier3-item2"},
{tier1: "tier1-item2", tier2: "tier2-item3", tier3: "tier3-item2"},
{tier1: "tier1-item2", tier2: "tier2-item4", tier3: "tier3-item2"},
{tier1: "tier1-item2", tier2: "tier2-item5", tier3: "tier3-item2"},
{tier1: "tier1-item1", tier2: "tier2-item1", tier3: "tier3-item3"},
{tier1: "tier1-item1", tier2: "tier2-item2", tier3: "tier3-item3"},
{tier1: "tier1-item1", tier2: "tier2-item3", tier3: "tier3-item3"},
{tier1: "tier1-item1", tier2: "tier2-item4", tier3: "tier3-item3"},
{tier1: "tier1-item1", tier2: "tier2-item5", tier3: "tier3-item3"},
{tier1: "tier1-item2", tier2: "tier2-item1", tier3: "tier3-item3"},
{tier1: "tier1-item2", tier2: "tier2-item2", tier3: "tier3-item3"},
{tier1: "tier1-item2", tier2: "tier2-item3", tier3: "tier3-item3"},
{tier1: "tier1-item2", tier2: "tier2-item4", tier3: "tier3-item3"},
{tier1: "tier1-item2", tier2: "tier2-item5", tier3: "tier3-item3"},
]
所以所有可能的项目组合都有一个对象。
我不一定要寻找代码示例,尽管它们很受欢迎,但更多的是朝着正确方向 es5+ 的概念推动。
解决方案
您需要一个简单的嵌套循环,如下所示:
function(input) {
let arr = [];
for (let i = 0; i < input["tier1"].length; i++) {
for (let j = 0; j < input["tier2"].length; j++) {
for (let k = 0; k < input["tier3"].length; k++) {
let obj = {
tier1: input["tier1"][i],
tier2: input["tier2"][j],
tier3: input["tier3"][k]
};
arr.push(obj);
}
}
}
return arr;
}
对于 n 层的通用解决方案,我们可以在不嵌套的情况下进行如下操作:
function allCombinations(input) {
let result = [];
(function recurse(input, n, outObject, outputArray) {
if (n > Object.keys(input).length) {
outputArray.push(outObject);
return;
}
let str = "tier" + n;
for (let i = 0; i < input[str].length; i++) {
let obj = Object.assign({}, outObject);
obj[str] = input[str][i];
recurse(input, n+1, obj, outputArray);
}
})(input, 1, {}, result);
return result;
}
基本上,我们选择一个层的每个元素,将其克隆并递归到下一层,直到我们到达终点。
推荐阅读
- tensorflow - 如何修复 MNIST 手写数据集的 lstm 和 cnn 代码
- python - 如何修复:pywintypes.com_error:(-2147352573,'未找到成员。',无,无)
- regex - 使用正则表达式对密码进行特殊字符验证
- c# - 如何在 C# 中将所有数组值提取到 datagridview?
- codeigniter-3 - 输入字段数组的 myfunction
- r - 如何设置 install_keras() 的 virtualenv?
- javascript - JSON 解析错误:意外的标识符“be”
- mysql - 如何使用逗号拆分列的值并在 MySQL 中显示在行中
- java - Javers SpringBoot 集成 QueryBuilder byInstanceId 返回空结果
- amazon-s3 - Terraform - 在 S3 存储桶上启用请求指标