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



我目前正在编写一个脚本,该脚本随机生成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(而不重复数组"中的项;津贴";?

提前感谢!

使用函数的方式与我在不修改原始数组的情况下使用函数的方法相同。从数组中传递想要返回的项数,然后在返回时对其进行销毁

let perks = ["Smith", "Wrecker", "Scavenger", "Cat", "Friendly", "Tenacious"];
function dup(len) {
const a = [];
const arr = [...perks];

for (let i = 0; i < len; i++) {
let i = Math.floor(Math.random() * arr.length); 
a.push(arr.splice(i, 1)[0]);
}

return a;
}
let [p1, p2, p3] = dup(3);
console.log(p1, p2, p3);

或者,您可以更改随机数,并将其从数组中拼接出来,用于您需要的每个项目。

let perks = ["Smith", "Wrecker", "Scavenger", "Cat", "Friendly", "Tenacious"];
const arr = [...perks];
let i = Math.floor(Math.random() * arr.length);
let p1 = arr.splice(i, 1)[0];
i = Math.floor(Math.random() * arr.length);
let p2 = arr.splice(i, 1)[0];
i = Math.floor(Math.random() * arr.length);
let p3 = arr.splice(i, 1)[0];
console.log(p1, p2, p3);

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

function getRandomIndexes(arr, indexesCount) {
if (indexesCount > arr.length) {
return [];//Cant extract more items than we have in array.
}
const indexesSet = new Set();
while (indexesSet.size < indexesCount) {
indexesSet.add(Math.floor(Math.random() * arr.length));
}
const op = [];
for (let index of indexesSet) {
op.push(arr[index]);
}
return op;
}

let perks = ["Smith", "Wrecker", "Scavenger", "Cat", "Friendly", "Tenacious"];
let [p1, p2, p3] = getRandomIndexes(perks, 3);
console.log({p1,p2,p3})

注意:如果arr.length接近indexesCount,这种方法可能会很糟糕,在这种情况下,克隆和混洗可能是更好的方法,或者您可以获得arr.length-n随机值并将其过滤掉,而不是获得n个随机值。

最新更新