繁体   English   中英

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

[英]How to pull multiple items from one array without repeats in 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),而不会从数组“perks”中的项目中重复?

提前致谢!

一种方法是使用生成随机索引,直到从数组中获得 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 ,这种方法可能会很糟糕,在这种情况下,克隆和改组可能是一种更好的方法,或者不是获取 n 个随机值,您可以获取arr.length-n随机值并将它们过滤掉。

使用 function 将是我在不修改原始数组的情况下这样做的方式。 从数组中传回你想要的项目数,然后在返回时解构它

 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM