我目前正在使用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,例如。
答案 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('')))