javascript - 从 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);
}
解决方案
您对“洗牌”的定义是不正确的......与其从数组中挑选随机项目然后不得不将它们从数组中拼接出来,为什么不使用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());
}
在尝试编写自己的洗牌算法之前要三思而后行……比你或我更聪明的人以前在这方面搞砸了。
推荐阅读
- unity3d - Layout Group 中的 Unity GameObjects 在 Android 上的大小与 Unity Gamescreen 不同
- python - 以excel中特定单元格的值为条件
- amazon-web-services - Docker ImagePush 因“没有基本身份验证凭据”而失败
- mysql - SQL 按 2 个条件排序
- r - 弯括号之间的匹配数字
- php - (PHP) 实时输出 proc_open
- python - 如何排列元组列表,以便删除与其他元组相比最高值的元组并返回最大值
- java - 为不同类型的员工实施不同的谓词
- javascript - 是否可以更改 npm 模块的获取请求的标头?如果是这样,怎么做?
- c# - 泛型方法不知道该类型有具体方法