检测数组中有多少种不同类型的值

时间:2013-06-29 16:49:53

标签: javascript

我知道我可以使用这个答案的变体来找出数组中有多少种不同类型的数据:

How to count the number of certain element in an array?

但是,我正在寻找的是,是否有一种简单的方法来计算数组中有多少种不同类型的数据:

我的数组可能有0,1或2作为值

所以它可能是:

a = [1,2,0,1,1,1];

或者它们可能都是相同且不同的长度:

a = [1,1,1,1,1,1,1,1,1,1,1,1,1];

在javascript中,我想要一个函数,如果所有值都相同则返回“1”,如果只混合了两个可能的值,则返回“2”,如果数组包含所有三个值,“3” ”

任何帮助表示赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

简单的方法是保留已找到值的地图,并记住每次添加它时:Live Example | Live Source

function countUniques(a) {
    var valuesSeen = {};
    var count = 0;

    a.forEach(function(value) {
        if (!valuesSeen[value]) {
            ++count;
            valuesSeen[value] = true;
        }
    });
    return count;
}

(注意:这使用的是ES5的forEach。如果您使用的是旧版浏览器,则需要对其进行填充,搜索“ES5 shim”以找到它的垫片。)< / em>的

或者如果你不喜欢与你一起工作的人,并且喜欢使用操作符而不是分支语句:Live Copy | Live Source

function countUniques(a) {
    var valuesSeen = {}, count = 0;

    a.forEach(function(value) {
        valuesSeen[value] || (++count,  valuesSeen[value] = true);
    });
    return count;
}

答案 1 :(得分:3)

只是为了好玩,这是一个使用.reduce的“更有趣”(并且有点混淆)的解决方案,它不需要局部变量:

function countUniques(a) {
     return a.reduce(function(p, v) {
         p.c += !(v in p.s); p.s[v] = 1; return p;
     }, {c:0, s:{}}).c;
}

它在功能上与TJC的答案相同,只是valuesSeencount值作为对象p传递,作为从{{的前一次迭代传递的“previous”值。 1}} .reduce.元素相当于TJC的p.ccountp.s

请注意,valuesSeen(如.reduce)是一个ES5函数,需要在旧浏览器上使用填充程序。