Jan 07

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

Technorati Tags: , , ,

Related posts:

Tags: , , ,
(Visited 2020 times)

4 Responses to “[Javascript] 從 array 裡隨機挑出不重複的值”

  1. fred Says:

    js裡有foreach可以用

    Joe Horn Reply:

    我最常用的參考文件是 w3schools,可是我沒看到。

    Google 搜尋 Javascript foreach,看到的也幾乎都是文中提到的 For ... In ... 。


    From Taiwan Taiwan
    Using Mozilla Firefox Mozilla Firefox 3.5.7 on Windows Windows XP
  2. 裝笑幃 Says:

    var r = Math.floor( Math.random() * (fruits.length - 1) );
    這行應該是
    var r = Math.floor( Math.random() * fruits.length );

    如果 "減一" 那麼 Array 裡面的最後一個只有在最後的時候才取的到....

    Joe Horn Reply:

    已修正,謝謝您的指正。 :oops:


    From Republic Of Korea Republic Of Korea
    Using Mozilla Firefox Mozilla Firefox 3.5.6 on Windows Windows XP

Leave a Reply