我有一个对象数组,我试图找到它的所有组合。我有一些代码可以找到所有的组合,但是它只根据输入数组的长度找到组合的数量。
例如,如果我使用下面的数组,并使用下面的函数,我得到了27个可能的组合,但是这不包括元素本身或两个元素。
[
[{ optionName: "red" },{ optionName: "blue" },{ optionName: "green" }],
[{ optionName: "S" },{ optionName: "L" },{ optionName: "XL" }],
[{ optionName: "spotted" },{ optionName: "striped" },{ optionName: "lined" }],
]例如,我得到的组合如下所示:
[{ optionName: "red" },{ optionName: "L" },{ optionName: "spotted" }]
[{ optionName: "red" },{ optionName: "S" },{ optionName: "spotted" }]
[{ optionName: "red" },{ optionName: "S" },{ optionName: "lined" }]但是,我还想包含以下组合:
[{ optionName: "red" }]
[{ optionName: "red" },{ optionName: "S" }]
[{ optionName: "red" },{ optionName: "L" }]这是我正在使用的代码:
var r = [],
arg = arrayCombOptions,
max = arg.length - 1;
function helper(arr, i) {
for (var j = 0, l = arg[i].length; j < l; j++) {
var a = arr.slice(0);
a.push(arg[i][j]);
if (i == max) r.push(a);
else helper(a, i + 1);
}
}
helper([], 0);如何找到所有组合,包括单独组合和双重组合?
发布于 2020-05-03 23:19:40
您可以为每个内部数组添加一个像undefined这样的虚拟对象,生成一个笛卡尔乘积,只映射没有undefined的数组,并从1开始对数组进行切片,因为第一个数组也是空的。
var data = [[{ optionName: "red" }, { optionName: "blue" }, { optionName: "green" }], [{ optionName: "S" }, { optionName: "L" }, { optionName: "XL" }], [{ optionName: "spotted" }, { optionName: "striped" }, { optionName: "lined" }]],
result = data
.map(a => [undefined, ...a])
.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []))
.map(a => a.filter(Boolean))
.slice(1);
console.log(result.length);
document.getElementById('out').innerHTML = JSON.stringify(result, null, 4);<pre id="out"><pre>
发布于 2020-05-04 00:04:40
一个干净而简单的解决方案:您需要迭代数组的数组,并为每个单独的数组找到所有的可能性。
const addToEach = (element, arr) => [...arr, element];
const getAllPossibilitesForSingleArr = (arr) => {
let r = [];
for(let i=0;i<arr.length;i++) {
const combinationsSoFarWithNewElementAdded = r.map(ar => addToEach(arr[i],ar))
r.push(...combinationsSoFarWithNewElementAdded, [arr[i]]);
}
return r;
};
const getAllPossibilitesForArrays = arrays => arrays.map(getAllPossibilitesForSingleArr);为了在一个数组中找到我迭代过的数组中的所有可能性,在每次迭代中,我用一个新元素扩展结果数组,并用添加的新元素扩展到目前为止的所有组合。
你也可以用纯函数来做这件事(总是更好):
const getAllPossibilitesForSingleArrFunc = (arr) =>
arr.reduce((acc, curr,i) => {
const combinationsSoFarWithNewElementAdded = acc.map(ar => addToEach(arr[i],ar))
return [...acc, [arr[i]], ...combinationsSoFarWithNewElementAdded]
},[]);
const getAllPossibilitesForArraysFunc = arrays => arrays.map(getAllPossibilitesForSingleArrFunc);https://stackoverflow.com/questions/61576758
复制相似问题