2012-02-14 41 views
2

我在寻找一个简洁的JavaScript函数,它接收一些值并返回按出现次数排序的唯一值,最常出现的次数是第一次。返回按计数排序的唯一值的JavaScript函数

例如,如果输入是数组[3,2,2,2,2,1,2,1]那么输出应该是[2,1,3]

+3

完成大功告成看后,开始实施:) – 2012-02-14 16:21:35

+0

你是什么意思其他收藏品?只有对象('{}')和数组('[]'),我不知道如何将它应用于对象。 – 2012-02-14 16:23:54

+0

你可能是对的,我对此并没有太多想法,我从原始问题中删除了这些东西。 – user1069609 2012-02-14 16:29:46

回答

16

这是我的第一次刺伤。我敢打赌,我们可以简化它,但这似乎没问题。

function fancyUnique(arr) { 

    var counts = {}; // store counts for each value 
    var fancy = []; // put final results in this array 
    var count = 0; // initialize count 

    // create counts object to store counts for each value of arr 
    for (var i = 0; i < arr.length; i++) { 
    count = counts[arr[i]] || 0; // use existing count or start at 0 
    count++; // increment count 
    counts[arr[i]] = count; // update counts object with latest count 
    } 

    // take all keys from counts object and add to array 
    // also: object keys are string, so must parseInt() 
    for (var key in counts) { 
    fancy.push(parseInt(key, 10)); 
    } 

    // sort results array in highest to lowest order 
    return fancy.sort(function(a, b) { 
    return counts[b] - counts[a]; 
    }) 
} 


fancyUnique([22,22,1,1,1,1]) // [ 1, 22 ] 
+0

我喜欢它。我看不出有什么办法来改善它。你是从头开始编写还是从你的lib中读取? :) – user1069609 2012-02-14 16:52:04

+0

这是一个有点神秘,例如'count = uniques [arr [i]] ||会发生什么? 0;'行,请加几个注释请 – user1069609 2012-02-14 16:59:41

+0

我会加评论。它只是说基本上如果没有一个具体的数值计数,然后初始化为0. – 2012-02-14 18:13:53

0
var data=[3,2,2,2,2,1,2,1]; 
console.log(countUnique(data)); 

function countUnique(data){ 
    var count={}; 
    $(data).each(function(index){      
     count[data[index]] = count[data[index]]+1 || 1;    
    }); 
    return count; 
} 

输出= “对象{1:2,2:5,3:1}”

这适用于字串。

读取输出可以用下面的循环

for(var key in count) 
    { 
      console.log(key); // prints the index of the array 
      console.log(count[key]); //prints the number of occurrences 

    }