javascript - 找到最多 n 个数组项的所有组合,并且数组项可以重复

标签 javascript arrays

我有像 ['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/

相关文章:

javascript - karma 和 RequireJS : avoid duplication in src and test RequireJS config

javascript - 在 Javascript 中将文本框值相乘

java - 在 Java 中生成 2d Json 数组

javascript - 如何将 css 样式应用于动态 JavaScript 数组?

ios - Objective C 如何合并多个 NSMutableArray?

java - 我如何用一个为每种情况引用一个变量的列表替换 Java 中的开关?

javascript - 淡入前瞬间闪烁页面

javascript - 如何在ng grid中以编程方式取消选择angularjs中的一行

javascript - 属于 JavaScript 对象原型(prototype)的回调函数可以访问对象成员吗?

JavaScript 数组怪异?