Javascript:从数组中选择不等于“未定义”的随机元素

Javascript:从数组中选择不等于“未定义”的随机元素,javascript,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 有什么好办法吗 谢谢, Sam首先,我将循环遍历数组,去掉未定义的值。然后从结果数组中选择

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

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

有什么好办法吗

谢谢,
Sam

首先,我将循环遍历数组,去掉未定义的值。然后从结果数组中选择一个元素。

最好的方法是在循环中随机选择一个元素。如果选定元素不是未定义的,则退出循环。

< P>创建一个新数组,该数组由原始数组中的条目的索引组成,希望在你的情况下考虑{{ 1, 3, 5 } };然后从索引数组中以满足统计要求的任何方式选择一个随机元素,然后检索相应的值

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)];
}
多亏了

演示:


这有点棘手。基本情况是,首先过滤数组中的所有非“未定义”值。然后,新数组被传递到自调用函数中,在该函数中,我们只需调用随机元素上的console.log。我们需要确保对Math.random的调用不会传递一些浮点值,所以我使用~~来剪切数字。在那里使用Math.floor可能更方便。

随机选择一个索引,然后从该索引中搜索未定义的元素

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];
     }
   }
}

这里有一种不带偏见的方法,它不创建临时数组,只扫描数组一次。这是基于

缺点是Math.random会被调用多次。不过,可能有一些方法可以减少这种电话数量

一个好处是,它可以修改为选择N个独特的项目,而不是只选择一个。


arr=arr.filterfunction n{返回n!==undefined};如果您有一个很大的数组,其中大多数值都是未定义的,那么这可能会非常低效。
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];
     }
   }
}
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