🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

1271閲覧

each() のループ内でのみ .length が効かなってしまう

tarakorakko

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/12/20 01:00

###実現したいこと
以下の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()です。
これによれば、➂のcountundefinedであるがゆえに、結果も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をする。という流れだけでしたが、その他もっと早い方法などございましたら併せてご指南頂けましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

javascript

1const count = arr.lentgh; 2↓↓↓ 3const count = arr.length; 4

投稿2019/12/20 01:10

yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarakorakko

2019/12/20 08:29

!!! 失礼致しました。ありがとうございます。しかし「lentghというメソッドはないですよ」というエラーがでないのはなぜでしょうか?
tarakorakko

2019/12/20 09:53 編集

「ドットの次のアルファベットで予約語でないもの」は「オブジェクトの中身」と捉えられてしまって、「その中身が存在しないだけ」であって「エラーではない」ということでしょうか? つまり「arr.lentgh」だと「arrというオブジェクトの中身であるlentgh」を探すけど、それが存在しない。かといってエラーでもない。という?
yambejp

2019/12/20 10:17

プロパティーを参照してキーがないものはundefinedが変えるので エラーではありません。 undefinedのプロパティーなど参照すればエラーになります
tarakorakko

2019/12/20 12:06

ご返信どうもありがとうございます。納得できました。
guest

0

➂のcountがundefinedであるがゆえに、結果もundefinedとなるのだとわかりました。

lentghではなくlengthです。単なるスペルミスです。

投稿2019/12/20 01:14

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarakorakko

2019/12/20 08:30

くだらないことで失礼致しました。こういうエラーが出てくれるといいのですが。
tarakorakko

2019/12/20 09:55

今回エラーがでない原因はなんなのでしょうか?未定義のものを扱ったらエラーがでるのが通常ですよね?出てくれればすぐにスペルミスと気づけたかと思うのですが。
maisumakun

2019/12/24 01:11

> 未定義のものを扱ったらエラーがでるのが通常ですよね? いえ、JavaScriptでは、定義されていないプロパティを参照してもundefined値を返すだけで、エラーにはなりません。
guest

0

同じ現象を確認できなかったので、とりあえず、変えてみたところを書いてみます。

javascript

1const arr = arrays.filter(function(e,index){ 2 if (e[countkey] != ""){return true}; 3 });

上記が関係ないなら、連想配列の長さを取得する下記の書き方をするとかですかね。
私はarr.lengthで取得できましたが。。

javascript

1Object.keys(arr).length

中途半端な回答ですみません。。

投稿2019/12/20 03:03

shuzi

総合スコア197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarakorakko

2019/12/20 08:30

スペルミスだったようでした。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問