我有像 ['PP', 'PT, 'CK'] 这样的数组。我有n号。例如它是 4。我想生成最多 4 个数组项的所有组合,所以输出将类似于下面的所有组合
[['PP', 'PP', 'PP', 'PP'],
['PP', 'PP', 'PP', 'PT'],
['PP', 'PP', 'PT', 'PT'],
['PP', 'PT', 'PT', 'PT'],
['PT', 'PT', 'PT', 'PT'],
['PP', 'PP', 'PP', 'CK'],
['PP', 'PP', 'CK', 'CK'],
['PP, 'CK', 'CK', 'CK'],
['CK', 'CK', 'CK', 'CK'],
['PT', 'CK', 'CK', 'PP'],
['PT', 'PT', 'CK', 'PP],
['PT', 'PT', 'PT', 'CK']]
我试着写下面的代码,但它没有给我预期的输出
const getCombination = (arr, n) => {
const list = [];
if (arr.length === 1) {
const items = [];
for (let t = 0; t < n; t++) {
items.push(arr[0]);
}
list.push(items);
return list;
}
for (let i = n; i >= 0; i--) {
let k = i;
const items = [];
while (k > 0) {
items.push(arr[0]);
k--;
}
if (i === n) {
list.push(items);
continue;
}
let c = n - i;
let val = 1;
if (i === 0) {
val = 0;
}
for (let j = val; j < arr.length; j++) {
const op = [...items];
const l = arr[j];
let p = 0;
let isRun = false;
if (j === 0) {
continue;
}
while (p < c && items.length < n) {
op.push(l);
p++;
isRun = true;
}
if (isRun) list.push(op);
}
}
return list;
}
console.log("list", getCombination(["PP", "PT", "CK"], 4));
最佳答案
您可以采用递归,它返回一个数组,其中最后一项带有剩余计数,或者迭代实际元素的可能计数数。
然后将新数组的映射结果推送到结果集中。
Result with unique count of items.
PP PP PP PP PP PP PP PT PP PP PP CK PP PP PT PT PP PP PT CK PP PP CK CK PP PT PT PT PP PT PT CK PP PT CK CK PP CK CK CK PT PT PT PT PT PT PT CK PT PT CK CK PT CK CK CK CK CK CK CK
const
getCombinations = ([item, ...array], n) => {
if (!array.length) return [Array(n).fill(item)];
const result = [];
let m = n;
do {
const left = Array(m).fill(item);
result.push(...getCombinations(array, n - m)
.map(right => [...left, ...right])
);
} while (m--);
return result;
},
result = getCombinations(["PP", "PT", "CK"], 4);
result.forEach(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 找到最多 n 个数组项的所有组合,并且数组项可以重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68183640/