Javascript:从数组中选择不等于'undefined'的随机元素

时间:2012-01-04 02:22:10

标签: javascript

我有一个只设置了特定键的数组。该数组看起来像

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。

有没有好办法呢?

谢谢,
萨姆

8 个答案:

答案 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'; }) ));

演示:http://jsfiddle.net/y7g6x/

这有点棘手。基本上发生的是,首先针对所有非“未定义”值过滤数组。然后将新数组传递给自调用函数,我们在随机元素上调用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)

&#13;
&#13;
arr = arr.filter(function (n) { return n !== undefined });
&#13;
&#13;
&#13;