2016-04-28 16 views
1

で配列の要素の回出てくるカウント、私は各要素の周波数私はこのような配列を持っているJavaScriptの

var arr = [1, 5, 7, -1]; 
function countArray (arr){ 
    var map = []; 
    for (var i =0; i < arr.length ; i++){ 
     map[arr[i]]++; 
    } 
    console.log(map); 
} 

私はそれが[1: 1, 5: 1, 7: 1, -1: 1]を印刷することが期待console.logプリント[1: NaN, 5: NaN, 7: NaN, -1: NaN]

countしたいです

私はまあNaN

+1

'' ++行う前に、あなたは '0'に値を初期化する必要があります。それ以外の場合は、 'null + 1'を実行します。これはNaN(数値ではありません)です。これを、 'for'ループの始めに追加することで、これを解決することができます:' if(!map.hasOwnProperty(arr [i])){map [arr [i]] = 0; } ' – blex

+0

...あなたはDJですか? –

+0

@ JoshKG私はプログラミングを学ぶ独身のお母さんです。 –

答えて

4

を得ている理由を私は理解していません、最初の出現であれば、未定義を増やそうとします。まず定義されていないかどうかをチェックし、0を代入するか、インクリメントします。

そして、配列ではなくオブジェクトを使用する必要があります。オブジェクトにはkeyvalueがあり、Arrayは数字のインデックスでアクセスされる要素の順序付きセットです。

を使用してArrayオブジェクトを説明しています。インデックスの値が配列の最大インデックスより大きい場合は、サイズが変更されます。しかし、私はObjectが将来、他のタイプのキー(数字ではない)を使用する場合、コードは変更を必要としないので、Objectを使用する方が良いと思います。

var arr = [1, 5, 7, -1]; 
function countArray (arr) { 
    var map = {}; 
    for (var i =0; i < arr.length ; i++){ 
     map[ arr[i] ] = typeof map[ arr[i] ] === 'undefined' ? 1 : ++map[ arr[i] ]; 
    } 
    console.log(map); 
} 
+0

代わりに: 'map [arr [i]] =(map [arr [i]] || 0)+ 1'。 –

+0

これは良いイディオムのようです –

0

配列にすでにキーが含まれているかどうかを確認する必要があります。「in」を使用してそのことを確認できます。

var arr = [1, 5, 7, -1, -1]; 
function countArray (arr){ 
    var map = []; 
    for (var i =0; i < arr.length ; i++){ 
     if (arr[i] in map) map[arr[i]]++; 
     else map[arr[i]] = 1; 
    } 
    console.log(map); 
} 
countArray (arr) 

出力:

[1:1、5:1、7:1、-1:2]

+0

Objectプロトタイプ内のプロパティの名前と一致する要素が使用されていると、この問題が発生します。 'in'を使用している場合は、' hasOwnProperty'チェックを実行して結果をフィルタリングする必要があります。私はまた、OPがちょうど学んでいるという条件であなたの条件文の "インライン"スタイルを推薦することはできません。 – Carcigenicate

2

あなたの機能は結構ですが、あなたは、配列でそれを行うことができます

var arr = [1, 5, 7, -1, 1,1]; 
 

 
var r = arr.reduce((ac, x) => { if (!ac[x]) ac[x] = 0; return ac[x]++, ac},{}); 
 

 
document.write(JSON.stringify(r))

:1つのライナーを.reduce

..あなたがより読みやすい見つけるものは何でも減らすとexplanatory version (JSBin)

+1

私はちょうど私の1ライナーをここに置いて、あなたのことが一人ではないようにします: 'xs.reduce((acc、x)=> Object.assign(acc、{[x]:acc [x] || 0)+ 1})、{}); ' –

+2

特に指定のない限り、ブラウザの互換性を最大限に高めるために、そのような質問に答えるにはES5構文を使用してください。Arrow機能(ECMAScript 2015で導入されました)は、まだすべての主要なブラウザでサポートされていません(例えば、Windows 7で利用可能なIEの最高バージョンであるIE 11は、まだ広く使用されています)。 – blex

+1

@blexと可読性が悪い –

2

以上を選択します。

var arr = [1, 5, 7, -1];  

var count = arr.reduce(function(obj, next) { 
    obj[next] = ++obj[next] || 1; 
    return obj; 
}, {}); 
+0

ひだが大好きです。 – Carcigenicate

関連する問題