JavaScript-生成数组的所有排列

JavaScript-生成数组的所有排列,javascript,arrays,permutation,Javascript,Arrays,Permutation,我有不同的数组,都有数字,但元素的数量不同: var ar1 = [2, 5]; var ar2 = [1, 2, 3]; 我需要得到每个数组的所有排列。输出元素的长度应始终与输入数组的长度相同 这个结果应该是一个数组数组,如下所示: 对于ar1: [2, 5] [5, 2] 对于ar2: [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1] 我不想要笛卡尔积,每个数组都应该独立处理 到目前为止,我找到的所有解决方案都只创建

我有不同的数组,都有数字,但元素的数量不同:

var ar1 = [2, 5];
var ar2 = [1, 2, 3];
我需要得到每个数组的所有排列。输出元素的长度应始终与输入数组的长度相同

这个结果应该是一个数组数组,如下所示:

对于ar1:

[2, 5]
[5, 2]
对于ar2:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
我不想要笛卡尔积,每个数组都应该独立处理

到目前为止,我找到的所有解决方案都只创建顺序无关的数组,因此ar1的结果是只有一个数组,而不是两个

该解决方案应适用于输入数组中任意数量的元素。我们可以假设输入数组中没有重复的值。

您可以使用迭代和递归方法,直到没有更多的元素分布为止

函数置换(数组){
函数p(数组,临时){
变量i,x;
如果(!array.length){
结果:推送(温度);
}
对于(i=0;i

.as控制台包装{max height:100%!important;top:0;}
不确定这是否是最好的方法,但它似乎有效

@Nina的解决方案看起来不错,但是它做了相当多的数组concat&slice,所以这可能对更大的集合更有效,因为它避免了这一点。我确实使用对象进行重复检查,但hashmaps在JS中速度非常快

只是好奇,所以做了一个性能测试。 使用@Nina的溶液做[1,2,3,4,5,6,7],需要38.8秒,。 做我的175毫秒。。因此,阵列concat/slice会对性能造成巨大的影响,而标记的副本也会有同样的问题。只是一些需要注意的事情

var ar1=[2,5];
var ar2=[1,2,3];
函数组合(c){
var r=[],
len=c.长度;
tmp=[];
函数nodup(){
var-got={};
对于(var l=0;l控制台。时间结束('t1')希望这能解决您的问题。下面是一个基于递归的小而简单的解决方案:(combo=arr=>{if(!arr.length)return[];if(arr.length==1)return[arr];const results=[];for(let index=arr.length;index--;){const rest=arr.slice();rest.splice(index,1);combo(rest).forEach(combination=>{results.push([arr[index]].concat(combination))});}返回结果;})([0,1,2])请查看我的结果,关于性能,我得到的是8毫秒以下的结果,而你的需要360毫秒左右。@NinaScholz很好的更新,我的性能测试是在你的原件上。我想嫁给你:),顺便说一句,我完全支持你得到公认的答案。。你怎么没被提名参加主持人选举。你会得到我的选票。没有态度的聪明..我对'array.length | | result.push(temp);'很好奇你能解释一下它是怎么工作的吗?谢谢:)@limeintheconut,我将答案改为更具声明性的风格。是的,expression总是
true
,但是它应该测试
array
是否为空,因此应该将
temp
推送到结果集。