【问题标题】:How to pull multiple items from one array without repeats in NodeJS?如何在NodeJS中从一个数组中提取多个项目而不重复?
【发布时间】:2021-04-12 02:02:32
【问题描述】:

我目前正在编写一个为 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”中的项目?

提前致谢!

【问题讨论】:

  • 你可以复制数组,随机播放,然后.pop() items,直到它为空。然后再复制一份,洗牌,重复。这样你总是在重复之前遍历数组 - 如果前一个数组的最后一项和下一个数组的第一项相同,那么重复的唯一机会是 - 在这种情况下你可以删除它或重新洗牌。

标签: javascript node.js arrays


【解决方案1】:

使用函数就像我在不修改原始数组的情况下那样做。从数组中传回你想要的项目数,然后在返回时解构它

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

【讨论】:

  • 嗨,您提到 没有修改原始数组 但是您将数组 perks 传递给 dup 函数,并且在内部您正在执行 splice 这会影响原始数组,你可能想在传递它之前克隆数组。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多