1 月 7 2010
[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--; } } }
fred
2010-01-07 @ 17:53
js裡有foreach可以用
Joe Horn
2010-01-08 @ 02:54
我最常用的參考文件是 w3schools,可是我沒看到。
Google 搜尋 Javascript foreach,看到的也幾乎都是文中提到的 For … In … 。
裝笑幃
2010-01-08 @ 10:12
var r = Math.floor( Math.random() * (fruits.length – 1) );
這行應該是
var r = Math.floor( Math.random() * fruits.length );
如果 “減一” 那麼 Array 裡面的最後一個只有在最後的時候才取的到….
Joe Horn
2010-01-08 @ 20:46
已修正,謝謝您的指正。