[英]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.