我有一个只设置了特定键的数组。该数组看起来像
arr[0] = 'undefined';
arr[1] = '16';
arr[2] = 'undefined';
arr[3] = '13';
arr[4] = 'undefined';
arr[5] = 'undefined';
arr[6] = '24';
arr[7] = 'undefined';
从那个特定的数组我想要随机选择16,13或24。
有没有好办法呢?
谢谢,
萨姆
答案 0 :(得分:4)
创建一个新数组,其中包含您希望考虑的原始数组条目的索引(例如,在您的案例中为{1, 3, 5}
);然后从索引数组中选择一个随机元素(以满足您的统计要求的任何方式),然后检索相应的值。
答案 1 :(得分:1)
首先,我将循环遍历数组,删除undefined
值。然后从结果数组中选择一个元素。
答案 2 :(得分:1)
这样做的“最佳”方法是在循环中随机选择一个元素。如果所选元素未“未定义”,则退出循环。
答案 3 :(得分:0)
function randomFromTo(from, to){
return Math.floor(Math.random() * (to - from + 1) + from);
}
var Arr = // You define this
var answer = 'undefined';
while (answer == 'undefined'){
answer = Arr[randomFromTo(0, Arr.length)];
}
感谢http://www.admixweb.com/2010/08/24/javascript-tip-get-a-random-number-between-two-integers/
答案 4 :(得分:0)
(function( src ) {
console.log( src[ ~~(Math.random() * src.length) ] );
}( arr.filter(function( elem ) { return elem !== 'undefined'; }) ));
这有点棘手。基本上发生的是,首先针对所有非“未定义”值过滤数组。然后将新数组传递给自调用函数,我们在随机元素上调用console.log()
。我们需要确保对Math.random()
的调用不会提供某些浮点值,因此我使用~~
来减少数字。在那里使用Math.floor()
可能更方便。
答案 5 :(得分:0)
随机选择一个索引并从该索引中搜索非未定义的元素。
function getrandom(arr){
var ri = Math.floor(Math.random() * arr.length);
for(var i=0; i<arr.length; i++){
var ai = (i + ri)%arr.length;
if(arr[ai] != 'undefined'){
return arr[ai];
}
}
}
答案 6 :(得分:0)
这是一种无偏见的方法,不创建临时数组,只扫描一次数组。它基于reservoir sampling。
function pick_random_value(src)
local count = 0
local value = undefined
for( i=0; i<src.length; ++i)
{
if (src[i]==='undefined') { continue; }
++count;
if ( Math.random() < 1/count ) { value = src[i]; }
}
return value;
end
缺点是Math.random()
被多次调用。可能有办法减少这些电话数量。
一个好处是可以修改它以选择N个唯一的项目,而不仅仅是一个。
答案 7 :(得分:0)
arr = arr.filter(function (n) { return n !== undefined });
&#13;