如何在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 - 在单个数组中生成所有元素组合(成对)