如何使JavaScript只在数组中推送唯一的元素,同时也达到所需的长度?

如何使JavaScript只在数组中推送唯一的元素,同时也达到所需的长度?,javascript,arrays,Javascript,Arrays,我做了一个程序,该程序可以找出所有可能的板球队的组合方式。我还做了一些数学计算,得出总的组合方式应该是864。所以我希望所有数组的长度都是864,也包括所有的排列。我试着用if这个例子,但它似乎不起作用。我想要的是所有阵列都是唯一的。 我的JavaScript代码: console.time您的代码花费的时间; 让TotalArray=[]; 函数randomReturnmaxNum{ 让randomNumber=Math.roundMath.random*maxNum+1; 返回随机数; }

我做了一个程序,该程序可以找出所有可能的板球队的组合方式。我还做了一些数学计算,得出总的组合方式应该是864。所以我希望所有数组的长度都是864,也包括所有的排列。我试着用if这个例子,但它似乎不起作用。我想要的是所有阵列都是唯一的。 我的JavaScript代码:

console.time您的代码花费的时间; 让TotalArray=[]; 函数randomReturnmaxNum{ 让randomNumber=Math.roundMath.random*maxNum+1; 返回随机数; } 函数数组器{ 设currentArray=[ 第3条, 第5条, 第5条, 第5条, ]; 设sumOfNums=currentArray.reducex,y=>x+y; 如果sumOfNums!=11{ 返回数组器; }如果sumOfNums==11,则为else{ 返回电流阵列; } } 主要功能{ 让团队=阵列制造商; if!totalArrays.includesteam{ totalArrays.pushteam; totalArrays.sort }否则,如果totalArrays.includeTeam{ 主要的 totalarray.sort; } 而totalArrays.length<864{ 主要的 } } 主要的 对于let i=0;i<总长度;我++{ document.write[+TotalArray[i]+], } console.logtotalArrays.length console.timeEnd您的代码所用的时间 一种方法是使用Set

例如:

const mySet1 = new Set()
//instead of array.push(1);
mySet1.add(1)
mySet1.add(1) 
最后,如果要将其转换为数组,只需写一行即可

var array = [...mySet1]
有关SETAPI的详细参考,请使用mdn

但set只支持基元值,对于引用检查,数组不是基元

一个技巧是将数组转换为基本字符串

对数组进行arr.Sort排序 strigify数组JSON.stringifyarr 把它加到布景里 集合的每个条目都是一个表示数组的字符串 稍后,您可以使用JSON.parsearrString重新解构数组。一种方法是使用Set

例如:

const mySet1 = new Set()
//instead of array.push(1);
mySet1.add(1)
mySet1.add(1) 
最后,如果要将其转换为数组,只需写一行即可

var array = [...mySet1]
有关SETAPI的详细参考,请使用mdn

但set只支持基元值,对于引用检查,数组不是基元

一个技巧是将数组转换为基本字符串

对数组进行arr.Sort排序 strigify数组JSON.stringifyarr 把它加到布景里 集合的每个条目都是一个表示数组的字符串
稍后,您可以使用JSON.parsearrString重新解构数组。您可以这样做。总共有864个排列,但只有一些排列的和为11。您不需要随机猜测,您可以轻松地对下面这样的循环进行猜测。我已经为k和m添加了条件,以减少浪费的迭代

常量结果=[];
对于let i=1;我你可以这样做。总共有864个排列,但只有一些排列的和为11。您不需要随机猜测,您可以轻松地对下面这样的循环进行猜测。我已经为k和m添加了条件,以减少浪费的迭代

常量结果=[];
对于let i=1;我你不能这样比较数组,因为[1,1,1,1,1]!=[1,1,1,1,1]. 创建的每个数组都是一个单独的对象,在比较它们时,会比较对象引用

此外,由于在接近尾声时,您希望随机生成器生成仍然允许的唯一剩余数组,因此可能会进入一个非常长的猜测重试周期,在使用递归时会消耗堆栈

然而,结果是确定的:它是被排序的,并且具有和11的所有唯一排列。因此,最好在算法中排除随机因素。期望的结果并不是随机的

因此,请按如下方式实施:

设perms=[];
对于let i=1;我你不能这样比较数组,因为[1,1,1,1,1]!=[1,1,1,1,1]. 创建的每个数组都是一个单独的对象,在比较它们时,会比较对象引用

此外,由于在接近尾声时,您希望随机生成器生成仍然允许的唯一剩余数组,因此可能会进入一个非常长的猜测重试周期,在使用递归时会消耗堆栈

然而,结果是确定的:它是被排序的,并且具有和11的所有唯一排列。因此,最好在算法中排除随机因素。期望的结果并不是随机的

因此,请按如下方式实施:

设perms=[];
对于let i=1;i您提供的代码有两个主要问题:

Includes方法仅比较引用,以便[1,1,1,1]不一定等于[1,1,1,1]。我换了一些。 您可以拥有的最大阵列数为88,而不是864 以下是工作代码:

console.time您的代码花费的时间; 让TotalArray=[]; 函数randomReturnmaxNum{ 让randomNumber=Math.roundMath.random*maxNum+1; 返回域名号; } 函数数组器{ 设currentArray=[ 第3条, 第5条, 第5条, 第5条, ]; 设sumOfNums=currentArray.reducex,y=>x+y; 如果是sumOfNums!=11 { 返回数组器; }如果sumOfNums==11,则为else{ 返回电流阵列; } } 主要功能{ 而totalArrays.length<88{ 让团队=阵列制造商; 如果!totalArrays.someelem=>team[0]==elem[0]&&team[1]==elem[1]&&team[2]==elem[2]&&team[3]==elem[3]{ totalArrays.pushteam; } } totalarray.sort; } 主要的 对于let i=0;i<总长度;我++{ document.write[+TotalArray[i]+], } console.logtotalArrays.length
console.timeEnd您的代码所用的时间 您提供的代码有两个主要问题:

Includes方法仅比较引用,以便[1,1,1,1]不一定等于[1,1,1,1]。我换了一些。 您可以拥有的最大阵列数为88,而不是864 以下是工作代码:

console.time您的代码花费的时间; 让TotalArray=[]; 函数randomReturnmaxNum{ 让randomNumber=Math.roundMath.random*maxNum+1; 返回域名号; } 函数数组器{ 设currentArray=[ 第3条, 第5条, 第5条, 第5条, ]; 设sumOfNums=currentArray.reducex,y=>x+y; 如果sumOfNums!=11{ 返回数组器; }如果sumOfNums==11,则为else{ 返回电流阵列; } } 主要功能{ 而totalArrays.length<88{ 让团队=阵列制造商; 如果!totalArrays.someelem=>team[0]==elem[0]&&team[1]==elem[1]&&team[2]==elem[2]&&team[3]==elem[3]{ totalArrays.pushteam; } } totalarray.sort; } 主要的 对于let i=0;i<总长度;我++{ document.write[+TotalArray[i]+], } console.logtotalArrays.length

console.timeEnd您的代码所用的时间;我不明白你为什么要随机猜测这些数组,只是为了对它们进行排序。这意味着,如果你解决了includes错误,并且曾经到达那里,我认为这将需要很长时间,结果总是一样的。那么为什么不以非随机的方式生成那个数组呢?@trincot我不能用逻辑来实现你看,我只想要所有这些数组,我知道随机方法不是最有效的方法,但是我怎么能得到能够拥有所有逻辑的东西呢?我希望你能帮我,那太好了!我不明白你为什么要随机猜测这些数组,只是为了对它们进行排序。这意味着,如果你解决了includes错误,并且曾经到达那里,我认为这将需要很长时间,结果总是一样的。那么为什么不以非随机的方式生成那个数组呢?@trincot我不能用逻辑来实现你看,我只想要所有这些数组,我知道随机方法不是最有效的方法,但是我怎么能得到能够拥有所有逻辑的东西呢?我希望你能帮我,那太好了!我绝对可以试试,谢谢!我绝对可以试试,谢谢!他在范围内增加了1,所以是1-4和1-6,但我不确定这是否是他想要的。是的,更新了。他的随机发生器不是同质的。@AbdullahRazzaki是正确的,因为每个板球队实际上有22名球员,其中只有11名球员,这就是为什么每个队都有[4,6,6,6]的配置,通常是4名边门守门员、6名击球手、保龄球手和全能球员。请尝试编辑一下你的答案,我可能会接受这个答案!非常感谢您Hanks@trincot您的观点是正确的,我一定会尝试使用它们来改进我的代码。他正在将1添加到范围中,使其为1-4和1-6,但我不确定这是否是他想要的。是的,更新。他的随机发生器不是同质的。@AbdullahRazzaki是正确的,因为每个板球队实际上有22名球员,其中只有11名球员,这就是为什么每个队都有[4,6,6,6]的配置,通常是4名边门守门员、6名击球手、保龄球手和全能球员。请尝试编辑一下你的答案,我可能会接受这个答案!非常感谢您,Hanks@trincot您的观点是正确的,我一定会尝试使用它们来改进我的代码。这个答案很好,但这不是排列的工作方式,您只是简单地计算,但排列不止于此。我仍然感谢你阅读我的问题!我真的认为我错了,如果我错了,那我就错了sorry@DragonSoup什么意思?它会产生你预期的输出我实际上是错的,但让我告诉你排列是如何进行的检查这段视频你会看到是的,我理解,但你不需要所有排列,你只需要一个排序的数组列表,根据你的条件和11。如果你先生成所有的排列,然后过滤掉总和为11的排列,那将是浪费。这个答案很好,但这不是排列的工作原理,你只是简单地计算,但排列不止于此。我仍然感谢你阅读我的问题!我真的认为我错了,如果我错了,那我就错了sorry@DragonSoup什么意思?它会产生你期望的输出,我实际上是错的,但让我告诉你排列是如何进行的
他的视频你会看到是的,我理解,但你不需要所有的排列,你只需要一个数组的排序列表,根据你的条件和11。如果你先生成所有的排列,然后过滤掉总和为11的排列,那将是浪费。哦,现在我想第一点是有意义的!我错了。我必须检查数组中的所有元素是否与另一个数组中的所有元素匹配,而不仅仅是放一个等号。我真的很感谢你让我知道!不需要通过随机数生成结果。OP只是想要所有的排列。哦,现在我想第一点是有意义的!我错了。我必须检查数组中的所有元素是否与另一个数组中的所有元素匹配,而不仅仅是放一个等号。我真的很感谢你让我知道!不需要通过随机数生成结果。OP只是想要所有的排列。