2016-04-29 96 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; 
} 
相关问题