2016-04-29 62 views
1

作爲一個練習的答案,我必須創建一個函數,給定一個數組數組返回出現次數最多的函數,並且如果不止一個數字具有最大值發生次數返回次要發生次數。這是我所做的實現,但我正在拉我的頭髮,弄清楚爲什麼它在示例中返回10而不是9。如何獲得數組中數字的最大出現次數

它似乎是評估10 < 9爲真。怎麼了?

function maxOccurencies(arr) { 
 
    var aux = [], max = 0, final = null; 
 
    
 
    for (var i=0,t=arr.length; i<t; i++) { 
 
     aux[arr[i]] = (aux[arr[i]] || 0) + 1; 
 
     if (aux[arr[i]] > max) max = aux[arr[i]]; 
 
    } 
 
    
 
    for (x in aux) { 
 
     if (aux[x] == max && (x < final || final == null)) { 
 
      final = x; 
 
     } 
 
    }  
 
    
 
    return final; 
 
} 
 

 
document.write(maxOccurencies([10,10,10,9,9,9,8,7,4,5,1]));

回答

1

typeof(x)在你的第二個循環揭示了你的一些變量被鑄造爲string型!仍在研究這種情況的發生。您可以更換

if (aux[x] == max && (x < final || final == null)) { 

if (aux[x] == max && (parseInt(x) < parseInt(final) || final == null)) { 

返回正確值9

編輯:

很有意思,我不知道的JavaScript的在陣列的精確處理...循環。請參閱下面的其他問題的更多信息:

JavaScript For-each/For-in loop changing element types

Why is using 「for…in」 with array iteration such a bad idea?

另外請注意,您可以使用arr.forEach(function(element){...});和元素與它們的類型完好退回。

+1

是的,'for x in y'給出'x'的值,它們真的是鍵而不是數字。您可以將它們用於'y [x]',但不用於其他計算而不轉換它們的類型。 – m69

0

我認爲問題在於aux中的x不是數字,所以if語句沒有正確評估。當轉換爲數字時,它返回9(下)。

(3 == 3 & &( 「10」 < 「9」 || 「9」 == NULL))的計算結果爲真

function maxOccurencies(arr) { 
 
    var aux = [], max = 0, final = null; 
 
    
 
    for (var i=0,t=arr.length; i<t; i++) { 
 
     aux[arr[i]] = (aux[arr[i]] || 0) + 1; 
 
     if (aux[arr[i]] > max) max = aux[arr[i]]; 
 
    } 
 
    for (x in aux) { 
 
     if (aux[x] == max && (parseInt(x) < final || final == null)) { 
 
      final = parseInt(x); 
 
     } 
 
    }  
 
    
 
    return final; 
 
} 
 

 
document.write(maxOccurencies([10,10,10,9,9,9,8,7,4,5,1]));

0

「我拉我的頭髮弄清楚爲什麼它會在例子中返回10而不是9。「

這是因爲在這種比較中,10小於9,8,7,6,5,4,3,2,但有點擦菜板大於1 :)

這種小型修正會修復它:

function maxOccurencies(arr) { 
    aux = [], max = 0, final = null; 

    for (var i=0,t=arr.length; i<t; i++) { 
     aux[arr[i]] = (aux[arr[i]] || 0) + 1; 
     if (aux[arr[i]] > max) max = aux[arr[i]]; 
    } 

    for (x in aux) { 
     if (aux[x] == max && (+x < final || final == null)) { 
      final = x; 
     } 
    }  

    return final; 
} 
相關問題