首页 > 解决方案 > 如何在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”中的项目中重复?

提前致谢!

标签: javascriptnode.jsarrays

解决方案


一种方法是使用生成随机索引,直到从数组中获得 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随机值并将它们过滤掉。


推荐阅读