2

この回答のバリエーションを使用して、配列内に異なるタイプのデータがいくつあるかを調べることができることはわかっています。

配列内の特定の要素の数を数える方法は?

しかし、私が探しているのは、配列内にいくつの異なるタイプのデータがあるかを数えるための簡単な方法があるかどうかです:

値として 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 つだけ混合している場合は「2」を返し、配列に 3 つの値すべてが含まれている場合は「3」を返す関数が必要です。

どんな助けでも感謝します。ありがとう。

4

2 に答える 2

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;
}

The element is equal to TJC's and isの前の反復から渡された「前の」値として、 valuesSeenandのcount値がオブジェクトとして渡されることを除いて、機能的には TJC の回答と同じです。p.reduce.p.ccountp.svaluesSeen

.reduce(like .forEach) は ES5 関数であり、古いブラウザーでは shim が必要であることに注意してください。

于 2013-06-29T17:10:15.640 に答える
3

簡単なアプローチは、見つかった値のマップを保持し、それに追加するたびに覚えておくことですライブソース

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

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

(注: これは ES5forEachを使用します。古いブラウザーを使用している場合は、それをシムする必要があります。「ES5 シム」を検索してシムを見つけてください。)

または、一緒に働いている人があまり好きではなく、分岐ステートメントの代わりに演算子を使用するのが好きな場合: ライブソース

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

    a.forEach(function(value) {
        valuesSeen[value] || (++count,  valuesSeen[value] = true);
    });
    return count;
}
于 2013-06-29T16:53:56.527 に答える