[Javascript] 從 array 裡隨機挑出不重複的值

Javascript 提供了 For … In … ,我用的還蠻高興的(雖然我很少撰寫 Javascript)。
今天遇到某種特殊需求,我才發現這個迴圈語法並非萬能。

從 array 裡隨機挑出不重複的值有兩種情況,一種很單純,For … In … 迴圈可以處理的很好:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x;

while(fruits.length > 0) {
    var r = Math.floor( Math.random() * fruits.length );
    var n = fruits[r];
    document.write("Choosen[" + r + "]: " + n + "<br />");
    document.write("Array: " + fruits + "<br />");

    for(x in fruits) {
        if (fruits[x] == n) {
            fruits.splice(x, 1);
        }
    }
}

若是 array 裡面已經存在重複的值,而且 array 的資料的來源不方便控制(例如是 HTML 裡面的 li 物件),For … In … 這種方便的迴圈語法就必須放棄,改用傳統的 for 迴圈:

var fruits = [
    "Banana", "Banana", "Orange", "Orange",
    "Banana", "Apple", "Apple", "Orange", "Mango"
];
var i=0;

while(fruits.length > 0) {
    var r = Math.floor( Math.random() * fruits.length );
    var n = fruits[r];
    document.write("Choosen[" + r + "]: " + n + "<br />");
    document.write("Array: " + fruits + "<br />");

    for(i=0; i<fruits.length; i++) {
        if (fruits[i] == n) {
            fruits.splice(i, 1);
            i--;
        }
    }
}