2017-03-03 16 views
1
var items = [{ 
    "name": "James", 
    "gender": "boy" 
}, { 
    "name": "Sam", 
    "gender": "boy" 
}, { 
    "name": "Alice", 
    "gender": "girl" 
}]; 

上記のオブジェクトの配列にジェンダーの数を追加したいとします。それは男の子のように2、女の子は1です。値の代わりにオブジェクトの配列をプッシュ

var genderList = []; 
for(var i = 0; i < items.length ; i++){ 
     if(genderList.indexOf(items[i].gender) < 0){ 
     genderList.push(items[i].gender); 
     } 
} 

どうすればこのような結果が得られますか?

[{"name":"boy","count":2},{"girl","count":1}] 
+2

"girl"部分に値のないプロパティ名(またはプロパティ名のない値)があるため、目的の結果は有効なJSではありません。配列の代わりに '{" boy ":2、" girl ":1}'を使うのはなぜですか? – nnnnnn

+0

私はゲームに少し遅れていますが、私のコメントが何が起こっているのかを理解するのに役立つことを願っています! – Turnipdabeets

答えて

1

のように試してみてください - 私は{"boy": 2, "girl": 1}のような構造ではなく、配列内の出力を得ることをお勧めしたいです表示されたオブジェクトの作成、更新、および読み込みが簡単で効率的であるためです。

あなたは、あなたが示されてきた形式に変換できます。あなたは.reduce()に慣れていない場合、それは除いて、以下のループと同じことをし

var items = [ 
 
    { "name": "James", "gender": "boy"}, 
 
    { "name": "Sam", "gender": "boy"}, 
 
    { "name": "Alice", "gender": "girl"} 
 
]; 
 

 
var genderCount = items.reduce(function(a, c) { 
 
    a[c.gender] = (a[c.gender]||0) + 1; 
 
    return a; 
 
}, {}); 
 
console.log(JSON.stringify(genderCount)); 
 

 
var asArray = Object.keys(genderCount).map(v => ({ name: v, count: genderCount[v] })); 
 
console.log(JSON.stringify(asArray));

現在のスコープで追加の作業変数を作成する必要はありません。

var items = [ 
 
    { "name": "James", "gender": "boy"}, 
 
    { "name": "Sam", "gender": "boy"}, 
 
    { "name": "Alice", "gender": "girl"} 
 
]; 
 

 
var genderCount = {} 
 
for (var i = 0; i < items.length; i++) { 
 
    genderCount[items[i].gender] = (genderCount[items[i].gender]||0) + 1; 
 
} 
 
console.log(JSON.stringify(genderCount)); 
 

 
// then as above to get your array of objects output: 
 
var asArray = Object.keys(genderCount).map(v => ({ name: v, count: genderCount[v] })); 
 
console.log(JSON.stringify(asArray));

注:上記の例で私はそれが1行にコンソールに収まるようにするためにだけJSON.stringify()を使用していますが、それはカウント/変換プロセスの一部ではありません。

+0

'for'ループの例では、OPは結果としてオブジェクトの配列を期待しています。 – guest271314

+0

@ guest271314 - 結局、2番目のブロックにその部分を追加しました。そのフォーマットは、グラフ関数などに入力されない限り、私には意味をなさないが、彼女が求めたのは*である。どちらの方法でも、カウントフェーズ中に配列内の値を見つけて更新するのではなく、中間の{{"boy":2、 "girl":1} 'オブジェクトを最初に作成してマップする方が効率的だと思います。 – nnnnnn

+0

reduceパラメタのaとcは何ですか?読めない仲間。 – Mellisa

0

あなたが値をカウントするarray .reduce() methodを使用することができますthis.use Array.map

var items = [{ 
 
    "name": "James", 
 
    "gender": "boy" 
 
}, { 
 
    "name": "Sam", 
 
    "gender": "boy" 
 
}, { 
 
    "name": "Alice", 
 
    "gender": "girl" 
 
}]; 
 
var b=0,g=0; 
 
items.map((item)=>(item.gender=="boy")?b++:g++); 
 
var finalArray = [{"name":"boy","count":b},{"name":"girl","count":g}] 
 
console.log(finalArray);

+0

'.map()'の戻り値で何もしない場合は、 '.forEach()'を使ってください。 – nnnnnn

+0

性別が別の場合はどうすればいいですか?この解決法は柔軟性がありません。 – Mellisa

+0

これは三項演算子の代わりに 'if else if ..'を使って管理することができます。 –

1
var items = [ 
    { "name": "T", "gender": "other"}, 
    { "name": "James", "gender": "boy"}, 
    { "name": "Sam", "gender": "boy"}, 
    { "name": "Alice", "gender": "girl"} 
]; 

前の項目を取り、性別のタイプを比較します。それが存在する場合、我々は、我々はそれを作成しない場合は、1を追加して、我々は、オブジェクトからキーを取得し、性別にそれらを分離し、最終的に

var separateNameAndCount = Object.keys(genderTypes).map(type => ({ name: type, count: genderTypes[type] })); 

console.log('separateNameAndCount', separateNameAndCount) 

を数える1.

var genderTypes = items.reduce(function(prev, cur) { 
    prev[cur.gender] = (prev[cur.gender]||0) + 1; 
    return prev; 
}, {}); 

console.log('genderTypes', genderTypes) 

次を追加しますオブジェクトをjson形式に変換します

console.log(JSON.stringify(separateNameAndCount)); 
関連する問題