首页 > 解决方案 > 从 JS 数组中选择一个值并跳过它,直到显示所有值

问题描述

我有一个包含 6 个值的数组。我正在运行 Math.random 来随机播放它。但是,它每次都会对数组进行洗牌并显示一个重复的值。我想对数组进行洗牌并获得 1 个唯一值。这个值应该从数组中删除,直到所有其他值(如果获取)。例如,如果一个数组有 1,2,3,4 项,并且在对其进行洗牌后答案是 3。现在,我希望它排除 3 并从 1,2,4 中获取一个新值。


    const params = {
      icon_emoji: ':laughing:'
    };
    var members=['1','2','3','4','5','6','7'];
    var assignee = members[Math.floor(Math.random()*members.length)];

      bot.postMessageToChannel('general', `It's ${assignee}'s turn today!`, params);


}

function results() {


    const params = {
      icon_emoji: ':laughing:'
    };
    bot.postMessageToChannel('general', `Inside results`, params);


}

标签: javascriptarraysnode.jsshuffle

解决方案


您对“洗牌”的定义是不正确的......与其从数组中挑选随机项目然后不得不将它们从数组中拼接出来,为什么不使用Fisher-Yates洗牌实际洗牌(即以随机顺序重新排序)整个数组只是从该数组中弹出元素?

下面的洗牌功能是从这个答案复制而来的:

function shuffle(array) {
  let currentIndex = array.length,
    temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

const myArr = [1, 2, 3, 4, 5, 6];
shuffle(myArr);
while (myArr.length > 0) {
  console.log(myArr.pop());
}

在尝试编写自己的洗牌算法之前要三思而后行……比你或我更聪明的人以前在这方面搞砸了。


推荐阅读