2012-05-31 44 views
1

所以,我有這個程序要求數組中的最小偶數值,並且我編寫了代碼,但我似乎錯過了一個循環。我會寫正確的代碼,但我希望有人可以解釋爲什麼有一個while循環數組中的最小偶數值

<HTML> 
    <HEAD> 
    <SCRIPT LANGUAGE = "JavaScript"> 

    var number=new Array(10) 

    for(var i=0; i<number.length; i=i+1) 
{ 
    number[i] =window.prompt('enter number ','') 
    number[i] =parseFloat(number[i]) 
} 

    var y = 0 
    while (number[y] % 2 != 0) //get the first even number in the array 
{ 
    y = y + 1 
} 
//after you exit the while loop y will have the index of the first even number 

var Min 
Min = number[y] 

for(var i=0; i<number.length; i=i+1) 
{ 
    if (number[i] % 2 == 0) 
    { 
      if(number[i]<Min) 
      { 
        Min= number[i] 
      } 
    } 
} 

document.write(Min) 

</SCRIPT> 
</HEAD> 
</HTML> 

所以,這部分

var y = 0 
    while (number[y] % 2 != 0) //get the first even number in the array 
{ 
    y = y + 1 
} 
//after you exit the while loop y will have the index of the first even number 

我發現它很難真正掌握這個循環,如果我可能會問:是否有另一種方法來查找數組中的最小值? 非常感謝!

回答

3

while循環設置第一個值Min,以便後續比較工作。這裏有一個遠 簡單,更快捷的方式做同樣的事情:

var min = Infinity; // Start with the biggest number possible 
for (var i=myArray.length;i--;){ 
    var val = myArray[i]; 
    if (val<min && val%2==0) min = val; 
} 

這是更快,因爲—不像原來的代碼—這並不在第一非偶數值重複兩次。這將是在速度大約相當於如果for循環原開始在指數y,即for (var i=y+1;i<number.length;++i)

它也非常稍快一些,因爲for循環緩存數組的長度,而不是每次都尋找它,並且因爲它只在每個循環中查找數組中的值,而不是三次。像V8這樣的現代JavaScript運行時可以優化樸素代碼的行爲,但是,這不是一個非常重要的問題。


編輯:爲了好玩,這裏是一個現代化的,功能性的編程方法:

var min = Math.min.apply(Math,myArray.filter(function(n){ return n%2==0 })); 

上述用途Array.filter只創建偶數重視項目的一個新的數組,然後使用Function.prototype.apply將值數組作爲參數傳遞給Math.min

+0

@aablah既然你問到「另一種方式來找出最小」我已經編輯我的答案補充循環所有值的替代方法。如果你覺得這解決了你的問題,你應該[接受這個答案](http://meta.stackexchange.com/a/5235/153741)。 – Phrogz

0

如果你有興趣如何做到這一點在現代的Javascript,它是這樣的:

minEvenElement = Math.min.apply(Math, myArray.filter(function(e) { return !(e % 2) }))