考虑:
var myArray = ['January', 'February', 'March'];
如何使用 JavaScript 从该数组中选择一个随机值?
考虑:
var myArray = ['January', 'February', 'March'];
如何使用 JavaScript 从该数组中选择一个随机值?
这是一个简单的单行:
const randomElement = array[Math.floor(Math.random() * array.length)];
例如:
const months = ["January", "February", "March", "April", "May", "June", "July"];
const random = Math.floor(Math.random() * months.length);
console.log(random, months[random]);
如果您的项目中已经包含下划线或lodash,则可以使用_.sample
.
// will return one item randomly from the array
_.sample(['January', 'February', 'March']);
如果您需要随机获取多个项目,您可以将其作为下划线中的第二个参数传递:
// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);
或_.sampleSize
在 lodash 中使用该方法:
// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);
您可以考虑在 Array 原型上定义一个函数,以创建一个[].sample()
返回随机元素的方法。
首先,要定义原型函数,请将此代码段放在您的代码中:
Array.prototype.sample = function(){
return this[Math.floor(Math.random()*this.length)];
}
稍后,要从数组中采样一个随机元素,只需调用.sample()
:
[1,2,3,4].sample() //=> a random element
我将根据CC0 1.0 许可条款将这些代码片段发布到公共领域。
~~
比 快得多Math.Floor()
,因此在使用 UI 元素生成输出的同时进行性能优化时,~~
赢得了比赛。更多信息
var rand = myArray[~~(Math.random() * myArray.length)];
但是,如果您知道数组将有数百万个元素,那么您可能需要重新考虑按位运算符 和 之间的关系Math.Floor()
,因为按位运算符在处理大数时表现得很奇怪。请参阅下面的输出示例。
var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343
假设您想选择一个与上次不同的随机项目(不是真正随机,但仍然是一个常见的要求)......
/**
* Return a random element from an array that is
* different than `last` (as long as the array has > 1 items).
* Return null if the array is empty.
*/
function getRandomDifferent(arr, last = undefined) {
if (arr.length === 0) {
return;
} else if (arr.length === 1) {
return arr[0];
} else {
let num = 0;
do {
num = Math.floor(Math.random() * arr.length);
} while (arr[num] === last);
return arr[num];
}
}
像这样实现:
const arr = [1,2,3];
const r1 = getRandomDifferent(arr);
const r2 = getRandomDifferent(arr, r1); // r2 is different than r1.