javascript - 在 JavaScript 中创建对象数组的所有组合
问题描述
我想找到 n 数组的选项属性的所有组合。在示例中,数组的长度为 3,但该函数也应该适用于更大或更小的数组大小。
var arr = [{
name: 'Fruit',
options: ['apple', 'kiwi']
}, {
name: 'Food',
options: ['bread', 'rice']
}, {
name: 'Drink',
options: ['water', 'cola']
}]
结果应打印以下语句
Fruit: apple | Food: bread | Drink: water
Fruit: apple | Food: bread | Drink: cola
Fruit: apple | Food: rice | Drink: water
Fruit: apple | Food: rice | Drink: cola
Fruit: kiwi | Food: bread | Drink: water
Fruit: kiwi | Food: bread | Drink: cola
Fruit: kiwi | Food: rice | Drink: water
Fruit: kiwi | Food: rice | Drink: cola
我已阅读此答案Finding All Combinations (Cartesian product) of JavaScript array values,但在我的示例中,数组是一个对象,我无法弄清楚如何获取属性。这是我到目前为止所拥有的:
function allPossibleCases(arr) {
if (arr.length === 0) {
return [];
} else if (arr.length ===1){
return arr[0].options;
} else {
var result = [];
var allCasesOfRest = allPossibleCases(arr.slice(1)); // recur with the rest of array
for (var c in allCasesOfRest) {
for (var i = 0; i < arr[0].options.length; i++) {
console.log(arr[0].name, ": ", arr[0].options[i], "| ", allCasesOfRest[c])
}
}
return result;
}
}
输出是:
Food : bread | water
Food : rice | water
Food : bread | cola
Food : rice | cola
我错过了什么?
解决方案
您可以获取值、构建笛卡尔积并映射属性。
var array = [{ name: 'Fruit', options: ['apple', 'kiwi'] }, { name: 'Food', options: ['bread', 'rice'] }, { name: 'Drink', options: ['water', 'cola'] }],
keys = array.map(({ name }) => name),
result = array
.map(({ options }) => options)
.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []))
.map(a => Object.assign(...keys.map((k, i) => ({ [k]: a[i] }))));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- git - 我可以将“git rebase”表示为一系列精选内容吗?
- c - getnameinfo 无法执行反向 DNS
- javascript - karma-webpack 插件:捆绑文件在哪里?
- python-3.x - 使用 python3 为热图添加注释
- slack - 用于消息格式化的松弛块
- mysql - 不知道如何以适当的方式形成查询
- php - 如何在 cPanle Hosting 中设置“允许所有人”的权限,例如 Wamp
- c# - 捆绑 aria 脚本后 aria 日历控件不起作用
- ssas - MDX IIF 语句根据度量和层次结构叶计算新成员
- jquery - 如何迭代列表并根据窗口大小进行修剪?