2013-02-24 8 views
13

JavaScriptでは、配列内のエレメントの数が次のようになります。配列並べ替えなしで配列内のユニークエレメントをカウントする

arr = ["jam", "beef", "cream", "jam"] 
arr.sort(); 
var count = 1; 
var results = ""; 
for (var i = 0; i < arr.length; i++) 
{ 
    if (arr[i] == arr[i+1]) 
    { 
     count +=1; 
    } 
    else 
    { 
     results += arr[i] + " --> " + count + " times\n" ; 
     count=1; 
    } 
} 

に一つの要素の最小値が存在すると仮定すると、それはソート()を使用せずに、または任意の方法で配列を変異させずに、これを行うことは可能ですか?私は、配列を再作成しなければならないと思っていたし、並べ替えが新しく作成された配列で行うことができますが、私はどのような並べ替えなしで最良の方法を知りたい。 はい、私はプログラマではなくアーティストです、あなたの名誉です。

+0

コピーとソートは良い解決策のように聞こえる。なぜそれを避けたいですか? – Bergi

+2

辞書内の要素を押して、キーの数を数えることができます。 – zsong

+0

私はちょうどこれを回避する方法を知りたい。私はちょうど興味がある。第2に、それは他の要素が依存する元の配列を駄目にする。配列をオブジェクトに変換する方が良いかもしれません。しかし、私はソート上のオブジェクトのさまざまな部分に何が起こるのか分かりません。 –

答えて

30

これを行う簡単な方法は、一意の要素をオブジェクトにコピーすることです。

var counts = {}; 
for (var i = 0; i < arr.length; i++) { 
    counts[arr[i]] = 1 + (counts[arr[i]] || 0); 
} 

このループが完了するとcounts物体がアレイの各個別要素の数を有することになります。

+0

これはユニークな要素が文字列(または一意の文字列に変換)の場合にのみ有効です – Bergi

+2

@Bergiは付与されましたが、OPの例です。 – kojiro

+0

'' jam'、 '' beef''、 '' cream''、 'jam'の場合は、OPの例の変数です。私たちは彼らが何を含んでいるのか分からない – Bergi

5

この表現は、それを変異することなく、あなたの配列内のすべてのユニークな要素を提供します:

arr.filter(function(v,i) { return i==arr.lastIndexOf(v); }) 

あなたはソートせずに結果のあなたの文字列を構築するために、この表現でそれをチェーンすることができます

.forEach(function(v) { 
    results+=v+" --> " + arr.filter(function(w){return w==v;}).length + " times\n"; 
}); 

でフィルタが取る最初のケースは各特定の要素の最後のものだけを含みます。 2番目のケースでは、フィルタにはそのタイプのすべての要素が含まれ、.lengthがカウントを与えます。

+0

'filter'と' [last] indexOf'の両方にJavaScript 1.6が必要です。この回答は、説明的なコメントを使用する可能性があります。 – kojiro

+1

フィルタコールバックは、要素ではなくブール値を返す必要があります。そしてあなたのfor-eachループはOPオリジナルのスクリプトと同じではありません – Bergi

7

速い方法はnew Set() objectです。

設定はすばらしく、より頻繁に使用する必要があります。それらは高速で、Chrome、Firefox、Microsoft Edge、node.jsでサポートされています。 。

: -

Set内のアイテム、それはあなただけで入れた各値のコピーを保持し、常に、一意になりアンドレイKashchaによってWhat is faster Set or Object?は、ここでは、このプロパティを使用する関数です

function countUnique(iterable) { 
 
    return new Set(iterable).size; 
 
} 
 

 
console.log(countUnique('banana')); //=> 3 
 
console.log(countUnique([5,6,5,6])); //=> 2 
 
console.log(countUnique([window, document, window])); //=> 2

これは、アルゴンを含む任意のiterable(の項目をカウントするために使用することができますray、String、TypedArray、およびargumentsオブジェクト)。

0

はなぜのようなものではない:

var arr = ["jam", "beef", "cream", "jam"] 
 
var uniqs = arr.reduce((acc, val) => { 
 
    acc[val] = acc[val] === undefined ? 1 : acc[val] += 1; 
 
    return acc; 
 
}, {}); 
 
console.log(uniqs)

ピュアJavascriptが、O(n)ので実行されます。あなたの一意の値の数が要素の数に等しい(すべての要素が一意である)場合を除き、多くのスペースを消費しません。

関連する問題