博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从JavaScript数组获取随机值
阅读量:2289 次
发布时间:2019-05-09

本文共 6950 字,大约阅读时间需要 23 分钟。

考虑:

var myArray = ['January', 'February', 'March'];

如何使用从此数组中选择随机值?


#1楼

假设您要选择与上次不同的随机项目(不是真正随机的,但仍然是常见要求)...

以@Markus的答案为基础,我们可以添加另一个原型函数:

Array.prototype.randomDiffElement = function(last) {   if (this.length == 0) {      return;   } else if (this.length == 1) {      return this[0];   } else {      var num = 0;      do {         num = Math.floor(Math.random() * this.length);      } while (this[num] == last);      return this[num];   }}

并像这样实现:

var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)

#2楼

我认为,与其乱搞原型或及时声明它,不如将其暴露在窗口中:

window.choice = function() {  if (!this.length || this.length == 0) return;  if (this.length == 1) return this[0];  return this[Math.floor(Math.random()*this.length)];}

现在,您可以在应用中的任何位置调用它,如下所示:

var rand = window.choice.call(array)

这样您仍然可以正确使用for(x in array)循环


#3楼

如果您有固定值(例如月份名称列表)并且想要单行解决方案

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

数组的第二部分是访问操作,如


#4楼

如果您的项目中已经包含或 ,则可以使用 。

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

或在中使用方法:

// will return two items randomly from the array using lodash_.sampleSize(['January', 'February', 'March'], 2);

#5楼

原型法

如果计划大量获取随机值,则可能要为其定义一个函数。

首先,将其放在您的代码中:

Array.prototype.sample = function(){  return this[Math.floor(Math.random()*this.length)];}

现在:

[1,2,3,4].sample() //=> a random element

根据的条款向公共领域发布的代码。


#6楼

这类似于@Jacob Relkin的解决方案,但比它更笼统:

这是ES2015:

const randomChoice = arr => {    const randIndex = Math.floor(Math.random() * arr.length);    return arr[randIndex];};

该代码的工作方式是选择一个介于0和数组长度之间的随机数,然后返回该索引处的项目。


#7楼

这是一个如何做的例子:

$scope.ctx.skills = data.result.skills;    $scope.praiseTextArray = [    "Hooray",    "You\'re ready to move to a new skill",     "Yahoo! You completed a problem",     "You\'re doing great",      "You succeeded",     "That was a brave effort trying new problems",     "Your brain was working hard",    "All your hard work is paying off",    "Very nice job!, Let\'s see what you can do next",    "Well done",    "That was excellent work",    "Awesome job",    "You must feel good about doing such a great job",    "Right on",    "Great thinking",    "Wonderful work",    "You were right on top of that one",    "Beautiful job",    "Way to go",    "Sensational effort"  ];  $scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)];

#8楼

我已经找到了解决最复杂答案的方法,只需将变量rand连接到另一个变量,该变量就可以在调用myArray [];时显示该数字。 通过删除创建的新数组并解决其复杂性,我提出了一个可行的解决方案:


#9楼

最短的版本:

var myArray = ['January', 'February', 'March']; var rand = myArray[(Math.random() * myArray.length) | 0]

#10楼

创建一个随机值并传递给数组

请尝试以下代码。

//For Search textbox random valuevar myPlaceHolderArray = ['Hotels in New York...', 'Hotels in San Francisco...', 'Hotels Near Disney World...', 'Hotels in Atlanta...'];var rand = Math.floor(Math.random() * myPlaceHolderArray.length);var Placeholdervalue = myPlaceHolderArray[rand];alert(Placeholdervalue);

#11楼

var item = myArray[Math.floor(Math.random()*myArray.length)];

或更短的版本:

var item = myArray[(Math.random()*myArray.length)|0];

样例代码:

var myArray = ['January', 'February', 'March']; var item = myArray[(Math.random()*myArray.length)|0]; console.log('item:', item);


#12楼

var rand = myArray[Math.floor(Math.random() * myArray.length)];

#13楼

如果要像Pascual的解决方案一样将其写在一行上,另一种解决方案是使用ES6的find函数编写它(基于以下事实:从n项中随机选择一个的概率为1/n ):

var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i)); console.log(item);

如果有充分理由不将数组仅保存在单独的变量中,请使用该方法进行测试。 否则,其他答案( floor(random()*length和使用单独的函数)是您要走的路。


#14楼

递归的独立函数,可以返回任意数量的项(与相同):

function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {    const elements = [];    function getRandomElement(arr) {        if (elements.length < numberOfRandomElementsToExtract) {            const index = Math.floor(Math.random() * arr.length)            const element = arr.splice(index, 1)[0];            elements.push(element)            return getRandomElement(arr)        } else {            return elements        }    }    return getRandomElement([...array])}

#15楼

具有许多实用程序功能,用于生成随机测试数据。 在测试套件的上下文中,这是一个不错的选择:

const Faker = require('faker');Faker.random.arrayElement(['January', 'February', 'March']);

正如评论者提到的那样,通常不应在生产代码中使用此库。


#16楼

简单功能:

var myArray = ['January', 'February', 'March'];function random(array) {     return array[Math.floor(Math.random() * array.length)]}random(myArray);

要么

var myArray = ['January', 'February', 'March'];function random() {     return myArray[Math.floor(Math.random() * myArray.length)]}random();

要么

var myArray = ['January', 'February', 'March'];function random() {     return myArray[Math.floor(Math.random() * myArray.length)]}random();

#17楼

static generateMonth() { const theDate = ['January', 'February', 'March']; const randomNumber = Math.floor(Math.random()*3); return theDate[randomNumber]; };

您为数组设置了一个常量变量,然后有了另一个常量,该常量在数组的三个对象之间随机选择,然后该函数简单地返回结果。


#18楼

~~Math.Floor()快得多,因此在使用UI元素生成输出时进行性能优化时, ~~赢得了比赛。

var rand = myArray[~~(Math.random() * myArray.length)];

但是,如果您知道该数组将拥有数百万个元素,那么您可能不希望在Bitwise运算符和Math.Floor()之间重新考虑,因为bitwise运算符在处理大量数字时表现Math.Floor()奇怪。 参见下面的示例,对输出进行解释。

var number = Math.floor(14444323231.2); // => 14444323231var number = 14444323231.2 | 0; // => 1559421343

#19楼

编辑数组原型可能是有害的。 这是完成这项工作的简单功能。

function getArrayRandomElement (arr) {  if (arr && arr.length) {    return arr[Math.floor(Math.random() * arr.length)];  }  // The undefined will be returned if the empty array was passed}

用法:

// Example 1var item = getArrayRandomElement(['January', 'February', 'March']);// Example 2var myArray = ['January', 'February', 'March'];var item = getArrayRandomElement(myArray);

#20楼

获取随机元素的通用方法:

let some_array = ['Jan', 'Feb', 'Mar', 'Apr', 'May']; let months = random_elems(some_array, 3); console.log(months); function random_elems(arr, count) { let len = arr.length; let lookup = {}; let tmp = []; if (count > len) count = len; for (let i = 0; i < count; i++) { let index; do { index = ~~(Math.random() * len); } while (index in lookup); lookup[index] = null; tmp.push(arr[index]); } return tmp; }


#21楼

另一种简单的方法:

var myArray = ['keke','keko','cano','halo','zirto'];var randomValue = myArray[Math.round((Math.random()*1000))%myArray.length];

#22楼

要获得随机项目表单数组,请使用

let rndItem = a=> a[rnd()*a.length|0]; let rnd = ()=> crypto.getRandomValues(new Uint32Array(1))[0]/2**32; var myArray = ['January', 'February', 'March']; console.log( rndItem(myArray) )


#23楼

我发现向Array类添加原型函数更加简单:

Array.prototype.randomElement = function () {    return this[Math.floor(Math.random() * this.length)]}

现在,我只需输入以下内容即可获得一个随机数组元素:

var myRandomElement = myArray.randomElement()

请注意,这将为所有数组添加一个属性,因此,如果使用for..in一个数组,则应使用.hasOwnProperty()

for (var prop in myArray) {    if (myArray.hasOwnProperty(prop)) {        ...    }}

(这对您来说可能是麻烦,也可能不是麻烦。)

转载地址:http://zvdnb.baihongyu.com/

你可能感兴趣的文章
出现VW自适应方案报错already has a ‘content‘ property, give up to overwrite it的原因及解决办法
查看>>
vue3配置路由报错Catch all routes (“*“) must now be defined using a param with a custom regexp.
查看>>
VirtualBox中的Ubuntu没有权限访问共享文件夹/media/sf_bak
查看>>
Virtualbox中Linux添加一个新磁盘->创建分区->格式化->挂载分区
查看>>
VMware 虚拟机中添加新硬盘的方法
查看>>
在mac上安装和使用mysql-5.6.24
查看>>
在FC6上构建内核驱动模块编译环境
查看>>
Linux操作系统下设置NFS共享
查看>>
用busybox-1.1.0打造自己的2410文件系统2
查看>>
实现DHCP自动获取IP地址
查看>>
S3C2410触摸屏驱动代码分析1
查看>>
S3C2410触摸屏驱动代码分析2
查看>>
网络管理器小程序找不到所需的资源……
查看>>
最新版本mplayer移植pxa270成功
查看>>
memcpy函数代码分析
查看>>
GTK+图形化应用程序开发学习笔记(一)—概述
查看>>
扩大vmware硬盘容量
查看>>
s3c2440的dma操作的一般步骤
查看>>
Linux 时钟处理机制
查看>>
IOS 堆和栈的在内存中管理方式
查看>>