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

时间:2018-02-20 15:20:09

标签: javascript arrays node.js powerset

我目前正在使用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,例如。

2 个答案:

答案 0 :(得分:0)

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"]

答案 1 :(得分:0)

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

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('')))