从JavaScript数组中获取随机项
如何从从JavaScript数组中获取随机项,javascript,arrays,random,Javascript,Arrays,Random,如何从items中获取随机项?jQuery是JavaScript!它只是一个JavaScript框架。因此,要查找随机项,只需使用普通的旧JavaScript,例如 var items = Array(523, 3452, 334, 31, ..., 5346); var random = items[Math.floor(Math.random()*items.length)] 学分: 如果您确实必须使用jQuery来解决此问题(注意:您不应该): 如果给定一个数组,或者[0..n]中的一
items
中获取随机项?jQuery是JavaScript!它只是一个JavaScript框架。因此,要查找随机项,只需使用普通的旧JavaScript,例如
var items = Array(523, 3452, 334, 31, ..., 5346);
var random = items[Math.floor(Math.random()*items.length)]
学分:
如果您确实必须使用jQuery来解决此问题(注意:您不应该):
如果给定一个数组,或者[0..n]中的一个值给定一个数字,或者给定任何其他值,这个插件将返回一个随机元素,一个保证的随机值
为了增加乐趣,数组返回是根据数组的长度递归调用函数生成的:)
在进行演示另一种方法是向阵列原型添加一种方法:
(function($) {
$.rand = function(arg) {
if ($.isArray(arg)) {
return arg[$.rand(arg.length)];
} else if (typeof arg === "number") {
return Math.floor(Math.random() * arg);
} else {
return 4; // chosen by fair dice roll
}
};
})(jQuery);
var items = [523, 3452, 334, 31, ..., 5346];
var item = jQuery.rand(items);
使用下划线(或loDash:):
或者要洗牌整个阵列:
var randomArray = [
'#cc0000','#00cc00', '#0000cc'
];
// use _.sample
var randomElement = _.sample(randomArray);
// manually use _.random
var randomElement = randomArray[_.random(randomArray.length-1)];
较短:
// 1. Random shuffle items
items.sort(function() {return 0.5 - Math.random()})
// 2. Get first item
var item = items[0]
还有另一种方法:
const ArrayRandomModule = {
// get random item from array
random: function (array) {
return array[Math.random() * array.length | 0];
},
// [mutate]: extract from given array a random item
pick: function (array, i) {
return array.splice(i >= 0 ? i : Math.random() * array.length | 0, 1)[0];
},
// [mutate]: shuffle the given array
shuffle: function (array) {
for (var i = array.length; i > 0; --i)
array.push(array.splice(Math.random() * i | 0, 1)[0]);
return array;
}
}
或按照以下建议:
1.解决方案:定义阵列原型
Array.prototype.random=函数(){
返回此[Math.floor((Math.random()*this.length));
}
这将适用于内联数组
[2,3,5].random()
当然还有预定义的数组
var列表=[2,3,5]
list.random()
2.解决方案:定义接受列表并返回元素的自定义函数
函数get_random(列表){
返回列表[Math.floor((Math.random()*list.length));
}
随机获取([2,3,5])
如果您使用的是node.js,您可以使用。它只是从数组中随机选取一些内容。答案不会涉及jQuery。我从未见过对一个问题有如此多完全相同的回答……伟大的头脑,@BlindyI找到了一种涉及jQuery的方法!!(参见我的第二个答案)这个问题与完全相同,但强大的Mods在3年多的时间里都没有费心关闭它。相反,它们关闭了。数组有一个内置的长度属性-为什么要将它作为参数传递?!我想我的观点是,你可以传递任何长度,而不仅仅是数组的长度-如果你只想随机分配前两个条目,你可以在不更改方法的情况下,可以将长度设置为2。我认为将length属性作为参数传递不会出现性能问题,但我可能是错误的。像这样扩展主机对象通常不是一个好主意。您可能会被客户端将来的
Array.random
实现绊倒,而该客户端的行为与您不同rs,破坏未来的代码。在添加它之前,您至少可以检查它是否存在。仅为一个函数使用下划线或lodash可能会有些过分,但如果您正在执行任何复杂的js功能,那么它可以节省数小时甚至数天。现在,下划线也有更好的选择用于此。.sample([1,2,3,4,5,6])
您可能会在任何实际项目上使用uu。这不是一件坏事。lodash在npm上是模块化的,因此如果您愿意,您可以只安装示例
功能:我的信条是在任何项目中使用尽可能少的库。尽管如此,我最终总是使用lodash。不使用项非常方便[1]
是第二项,第一项是项[0]
。哦,对不起。因为项[0]没有给你一个统一的洗牌:下一步:let item=items.sort(()=>0.5-Math.random())[0];
Math.random()永远不会是1,也不应该是。最大的索引应该总是比长度小一个,否则你会得到一个未定义的错误。优雅的解决方案。我测试了它:var items=[“a”、“e”、“I”、“o”、“u”]
for(var I=0;I<1000000;I++){
var randomElement=items[Math.floor(Math.random()*items.length)]
if(objResults[randomElement]){
objResults[randomElement]++
}否则{
}
console.log(objResults)
经过1000000次迭代后,结果是非常随机的:对象{u:200222,o:199543,a:199936,e:200183,i:200116}
@AnkitPatial:这是一种“置乱”的方法数组,但问题是如何从数组中获取一个随机选择的元素。这有很大的区别。@virusMath.round
不是Math.floor
的有效替代品。使用round
会导致意外引用未定义的索引,例如Math.random()
为0.95,而items.length
为5。Math.round(0.95*5)
为5,这将是一个无效的索引。floor(random)
在您的示例中始终为零。答案不错。您可以更短:items[items.length*Math.random()|0]
:)@neoascetic这句话的要点是,从数组中选择一个元素不是jQuery的问题,它是公平掷骰子的通用JS.+1!@damd re:你建议的编辑-显然是不正确的,因为在iLife中定义插件和使用插件之间存在明显的分歧。但是为了一致性,我已经替换了$
在使用jQuery
的行中。肯定。每行的链式方法平均不到3个,而且$
没有每行至少使用一次,因此它没有足够的jQuery。这不是需要jQuery的问题。这是什么疯狂的~
?以前在JS中从未见过这种情况@hatboysam:-它本质上是将操作数转换为最接近的整数。实际上,它向下舍入,就像Math.floor
。回答不错。你仍然可以更短:items[items.length*Math.random()|0]
:)“实际上,它向下舍入,就像Math.floor”@programmer5000。它实际上向0舍入,即~(-1.5)计算结果为-1,而不是Math.floor给出的-2。仅供参考,这可以是一行:Math.floor(Math.random()*(max-min+1))+min
@EvanCarroll最好引用一个有用的链接,而不是向下投票f
(function($) {
$.rand = function(arg) {
if ($.isArray(arg)) {
return arg[$.rand(arg.length)];
} else if (typeof arg === "number") {
return Math.floor(Math.random() * arg);
} else {
return 4; // chosen by fair dice roll
}
};
})(jQuery);
var items = [523, 3452, 334, 31, ..., 5346];
var item = jQuery.rand(items);
Array.prototype.random = function (length) {
return this[Math.floor((Math.random()*length))];
}
var teams = ['patriots', 'colts', 'jets', 'texans', 'ravens', 'broncos']
var chosen_team = teams.random(teams.length)
alert(chosen_team)
var randomArray = [
'#cc0000','#00cc00', '#0000cc'
];
// use _.sample
var randomElement = _.sample(randomArray);
// manually use _.random
var randomElement = randomArray[_.random(randomArray.length-1)];
// use underscore's shuffle function
var firstRandomElement = _.shuffle(randomArray)[0];
// 1. Random shuffle items
items.sort(function() {return 0.5 - Math.random()})
// 2. Get first item
var item = items[0]
var item = items.sort(function() {return 0.5 - Math.random()})[0];
const ArrayRandomModule = {
// get random item from array
random: function (array) {
return array[Math.random() * array.length | 0];
},
// [mutate]: extract from given array a random item
pick: function (array, i) {
return array.splice(i >= 0 ? i : Math.random() * array.length | 0, 1)[0];
},
// [mutate]: shuffle the given array
shuffle: function (array) {
for (var i = array.length; i > 0; --i)
array.push(array.splice(Math.random() * i | 0, 1)[0]);
return array;
}
}
function rand(items) {
// "~~" for a closest "int"
return items[~~(items.length * Math.random())];
}
function rand(items) {
// "|" for a kinda "int div"
return items[items.length * Math.random() | 0];
}