2012-04-23 47 views
1

我有這個功能返回的數組的最大值:陣列最大值函數給出意想不到的結果

Array.prototype.max = function() { 

var max = this[0]; 
var len = this.length; 

for (var i = 1; i < len; i++) 
{ 

    if (this[i] > max) 
    {  
     max = this[i]; 
    } 
} 

    return max; 
} 

當我使用此數組:

var data1Values = ['0','0','0','0','3','0','6','12'] 

data1Values.max()返回6代替12。它以某種方式跳過最後一個值。

我已經插入alert(this[i])alert(max)內循環,並且它識別兩個值(12 this[i]和6爲max),但它不會進入條件。

這裏發生了什麼?

+1

可以使用'Math.max'用'。適用'從陣列中獲取最大值。 'Math.max.apply(null,data1Values);',所以如果你想要'Array.prototype'上的函數,這樣做...'Array.prototype.max = function(){return Math.max.apply null,this); };' – 2012-04-23 13:56:30

+0

我想知道這是否可能。爲什麼不添加回答? – mplungjan 2012-04-23 16:20:32

+0

@mplungjan:因爲它沒有在技術上回答被問到的問題。只是想提供它作爲一種替代方法。 – 2012-04-23 16:35:29

回答

1

您正在比較字符串。 「2」 是比 「1000」

變化更大,以數字或添加parseInt函數(此[I],10)

DEMO

Array.prototype.max = function() { 

    var len = this.length; 
    var max = -1; 
    for (var i=0; i < len; i++) { 
    var val = parseInt(this[i],10); 
    if (val > max) {  
     max = val; 
    } 
    } 

    return max; 
} 

var data1Values = ['0','0','0','0','3','0','6','12'] 

alert(data1Values.max()); 
+0

非常感謝:) – 2012-04-23 14:08:31

+0

YW ............... – mplungjan 2012-04-23 14:09:53

7

你有一個字符串數組,而不是數字。字符串「6」大於字符串「12」。

嘗試初始化您的數組而不加引號。

+2

因爲數字符號的排序與數字排序相同;也就是說,字符'9'具有比字符'8'更大的代碼值。但是,對於數字字符的多位字符串,如果第一個字符不同,那麼較大的字符串會確定較大的字符串值。就像字典中「apple」之前的「apple」這個詞一樣; 'a'小於'c',這就是最重要的。 – Pointy 2012-04-23 13:57:14

+0

感謝您的全面回答:) – 2012-04-23 14:07:00

相關問題