Javascript 如何从一个数组中提取多个项而不在NodeJS中重复?

Javascript 如何从一个数组中提取多个项而不在NodeJS中重复?,javascript,node.js,arrays,Javascript,Node.js,Arrays,我目前正在编写一个脚本,随机生成Mordhau的加载 我现在不担心它会计算积分,但我希望它不会重复任何选择的特权 我拥有阵列中的特权: let perks = ["Smith","Wrecker","Scavenger","Cat","Friendly","Tenacious"]; //etc etc 诚然,我选择它们的方式相当笨拙,但它基本上完成了任务 let p1 = p

我目前正在编写一个脚本,随机生成Mordhau的加载

我现在不担心它会计算积分,但我希望它不会重复任何选择的特权

我拥有阵列中的特权:

let perks = ["Smith","Wrecker","Scavenger","Cat","Friendly","Tenacious"]; //etc etc
诚然,我选择它们的方式相当笨拙,但它基本上完成了任务

let p1 = perks[Math.floor(Math.random()*(perks.length))]; //perk 1
let p2 = perks[Math.floor(Math.random()*(perks.length))]; //perk 2
let p3 = perks[Math.floor(Math.random()*(perks.length))]; //perk 3
有没有一种方法可以分配这些变量(p1、p2、p3),而不重复数组“perks”中的项目


提前谢谢

一种方法是使用生成随机索引,直到从数组中获得n个不同的索引:

函数getRandomIndexes(arr、IndexeCont){ 如果(索引>阵列长度){ return[];//提取的项目数不能超过数组中的项目数。 } const indexesSet=新集合(); while(indexesSet.sizelog({p1,p2,p3})使用函数的方式与不修改原始数组的方式相同。从数组中传递要返回的项数,然后在返回时对其进行分解

let perks=[“史密斯”、“破坏者”、“拾荒者”、“猫”、“友好”、“顽强”];
函数dup(len){
常数a=[];
const arr=[…额外津贴];
for(设i=0;i控制台日志(p1、p2、p3)
您可以复制数组,将其洗牌,然后
.pop()
项,直到其为空。然后再复制一份,洗牌,重复。这样,在重复之前,您总是会先检查阵列-重复的唯一机会是,如果上一个阵列的最后一个项目与下一个阵列的第一个项目相同-在这种情况下,您可以将其移除或重新洗牌。您好,您提到没有修改原始阵列,但是您正在将阵列
perks
传递给dup函数,并且在内部执行影响原始阵列的
splice
,您可能希望在传递之前克隆阵列。感谢您指出这一点:)。