生成数组的所有唯一组合的最佳方法?

jkh*_*man 4 javascript arrays recursion

假设我有这个数组:

\n
const input = [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d];\n
Run Code Online (Sandbox Code Playgroud)\n

我想创建这个输出:

\n
[\n  [\xe2\x80\x9ca\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cb\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9ca\xe2\x80\x9d, \xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9cb\xe2\x80\x9d],\n  [\xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d],\n  [\xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9cb\xe2\x80\x9d, \xe2\x80\x9cc\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9cc\xe2\x80\x9d],\n  [\xe2\x80\x9cc\xe2\x80\x9d, \xe2\x80\x9cd\xe2\x80\x9d],\n  [\xe2\x80\x9cd\xe2\x80\x9d]\n]\n
Run Code Online (Sandbox Code Playgroud)\n

我不关心组合的顺序或长度,只需要所有各种方法来唯一地组合数组中的项目。

\n

在 JavaScript 中执行此操作的最佳方法是什么?我怀疑 \xe2\x80\x99s 是一个漂亮的递归解决方案,但迭代也可以。

\n

另外,正确的技术术语是什么?

\n

גלע*_*רקן 6

正确的技术术语是幂集。这是规范的递归形式:

const f = (A, i=0) => i == A.length ? [[]] : f(A, i+1).flatMap(x => [x, [A[i]].concat(x)]);

console.log(JSON.stringify(f(['a', 'b', 'c', 'd'])));
Run Code Online (Sandbox Code Playgroud)