###実現したいこと
以下のarray
から、指定キーが空でないものをカウントしたいです。
js
1// カウント対象の配列 2var array = [ 3 { id:1, 'a':'a_1', 'b':'b_1' ,'c':'' }, 4 { id:2, 'a':'a_2', 'b':'' ,'c':'c_2' }, 5 { id:3, 'a':'' , 'b':'' ,'c':'c_3' }, 6 { id:4, 'a':'a_4', 'b':'b_4' ,'c':'' }, 7]; 8
例えばb
を指定したら「b
が空でないものをカウント」として{b:2}
を得て、
または指定がなければ「全てカウント」として{a:3,b:2,c:2}
を得たいです。
###発生している問題
each()
のループ内でのみ.length
が効かなくなってしまい、
得られる結果が{a:undefined,b:undefined,c:undefined}
となります。
###該当のソースコード
js
1// 結果がundefinedになってしまう 2console.log( 'countArray()', countArray(array) ); 3function countArray( array, countkeys ){ 4 countkeys = countkeys || ['a','b','c']; 5 let result = {}; 6 $.each(countkeys, function(i, countkey) { 7 //➀console.log('countArray() - countkey',countkey); 8 const arr = array.filter(e => e[countkey]); 9 //➁console.log('countArray() - arr', arr); 10 const count = arr.lentgh; 11 //➂console.log('countArray() - count', count); 12 result[countkey] = count; 13 }); 14 return result; 15}
###試したこと
まずは値の確認をしました。上の「該当のソースコード」にある➀➁➂のconsole.log()
です。
これによれば、➂のcount
がundefined
であるがゆえに、結果もundefined
となるのだとわかりました。
続いて簡易なコードで試すべくeach()
を除いて下記を書きました。
すると下記では普通に上の➂と同じことをしているcount
が正しく取得されました。
つまりeach()
のループ内でのみ.length
が効かなくなってしまう、という問題であるかと思うのですが、この解決策がわからずご助力を乞うた次第です。
js
1// テストとしてループがない状態で書いたら問題なし 2console.log( 'countTest()', countTest(array) ); 3function countTest( array ){ 4 const arr = array.filter(e => e['a']); 5 console.log('countTest() - arr', arr); 6 const count = arr.length; 7 console.log('countTest() - count', count); // きちんと取得できている 8 return count; 9}
ここまでのコードはこちらになります。
https://jsfiddle.net/cs6v4w0g/
また私が思いうかんだのは、カウントのために.filter
を使ってarr
なる配列を再編し、それに対して.length
をする。という流れだけでしたが、その他もっと早い方法などございましたら併せてご指南頂けましたら幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/20 08:29
2019/12/20 09:53 編集
2019/12/20 10:17
2019/12/20 12:06