如何在javascript中找到数组的所有组合

Posted

技术标签:

【中文标题】如何在javascript中找到数组的所有组合【英文标题】:How to find all combination of an array in javascript 【发布时间】:2018-07-31 00:12:21 【问题描述】:

我目前正在使用 node.js,我想查找/尝试由存储在数组中的数据组合产生的所有独特可能性。

例子:

// source array
var array = [0,1,2];

// what i need :
0
1
2
00
01
02
10
11
12
20
21
22
000
001
002
etc, up to a configurable length.

我浏览了论坛,并没有找到类似的东西。

我在 npm 上进行了搜索,发现一些库正在做类似的事情,但从来没有我需要的所有可能性。我觉得我的需求与冒泡排序算法非常相似,但我不知道该怎么做。

另外,最好不要同时将整个输出存储在一个变量中,因为我的代码需要处理更大的数组。

此时我错过的任何想法或解决方案都会有所帮助!

编辑:另外,我想不断尝试组合,直到我认为它足够了,例如 500 次尝试或者最后的组合长度为 5。

【问题讨论】:

到目前为止你有什么?我们如何提供帮助? javascript - Generating all combinations of elements in a single array (in pairs)的可能重复 对不起,我发的太快了,试图放标签,不小心放了回车...我用foreach循环尝试了几次,最后得到了一个非常类似于气泡的代码排序。但这还不够,因为我需要在某种限制下检查数组的所有可能性(假设在 X 组合之后我们停止,或者组合长度大于 Y)。 根据您想要对结果执行的操作,您可能会发现 yield 很有帮助。 @mbrandau 是的,这似乎非常相似,除了我也会使用字符。我会调查这个帖子,我看的时候没看到。感谢您的帮助! 【参考方案1】:

另一种方法,具有几个可重用的功能:

const flatten = arrays => [].concat.apply([], arrays);
const range = (lo, hi) => [...new Array(hi - lo + 1)].map((_, i) => i + lo)
const join = joiner => list => list.join(joiner)

const charSeqs = (n, chars) => (n < 1) 
    ? [[]]
    : flatten(chars.map(char => charSeqs(n - 1, chars).map(
        seq => flatten([char].concat(seq))
      )))

const allCharSeqs = (n, chars) => flatten(range(1, n).map(i => charSeqs(i, chars)))

console.log(allCharSeqs(3, [0, 1, 2]).map(join('')))

【讨论】:

【参考方案2】:
function variations(arr, length) 
    if (length == 0)
        return [];
    else if (length == 1)
        return arr.map(e => e.toString());

    let result = [];
    for (let i = 0; i < arr.length; i++) 
        for (let tail of variations(arr, length - 1))
            result.push(arr[i].toString() + tail);
    
    return result;


function variations2(arr, maxLength) 
    let result = [];
    for (let i = 0; i <= maxLength; i++)
        result = result.concat(variations(arr, i));
    return result;

例子:

var array = [0,1,2];
console.log(variations2(array, 2));

输出:

["0", "1", "2", "00", "01", "02", "10", "11", "12", "20", "21", "22"]

【讨论】:

请注意,permute 可能不是一个好名字,因为这意味着有 n!结果,并且每个值每个输出只使用一次。

以上是关于如何在javascript中找到数组的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Javascript从特定的单个数组中查找所有不重复的组合

Javascript - 在单个数组中生成所有元素组合(成对)

JavaScript,从几个数组中获取所有唯一组合[重复]

查找 JavaScript 数组值的所有组合(笛卡尔积)

如何从一个1d Numpy数组的所有排列组合中删除所有的圆台排列组合?

使用 JavaScript 将两个数组的所有可能组合作为数组数组获取