2012-01-04 135 views
2

我有一個只有特定鍵集的數組。該陣列看起來像Javascript:從數組中選擇不等於'undefined'的隨機元素

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

有沒有做到這一點的好辦法?

感謝,
山姆

回答

4

創建一個新的數組,其中包含索引您想要考慮的原始數組的條目(例如{1, 3, 5}在您的案例中);然後從索引數組中選取一個隨機元素(以滿足統計要求的任何方式),然後檢索相應的值。

1

首先,我將通過陣列剝出undefined值循環。然後從結果數組中選取一個元素。

1

這樣做的'最好'的方法是在循環中隨機選擇一個元素。如果所選元素不是「未定義」,則退出循環。

+1

這可能是非常低效的,如果你有一個巨大的數組,其中最值是「不確定」。 – 2012-01-04 02:28:50

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()

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]; 
    } 
    } 
} 
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個唯一的項目,而不是僅僅一個容易。

0

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

相關問題