質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

jQuery

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

Q&A

解決済

2回答

5431閲覧

jQueryで配列から一致する数をカウントする

skipping

総合スコア14

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/09/03 14:38

###目的
子リストの数をカウントしたいです。

###問題のコード
コードが長くてすみません。まずはサンプルです。
https://jsfiddle.net/psn5849w/136/

上のサンプルは下記コードですが、問題はjQueryの
var my_child_count = (parents.indexOf(my_post_num)).length;//カウントされない?
という部分でカウントされないことです。

これは配列parentsからmy_post_numと一致する数をlengthでカウントしているつもりですが、なぜかundifindになってしまいます。

改めまして目的ですが、このカウントを使って最後の行の
$(this).find('.count-box').text(my_child_count);
.count-boxのテキストをカウント数に書き換えることです。

なぜカウントされないのか、ご教示頂ければと思いご質問させて頂きました。

html

1<div class="alllists"> 2 <ul> 3 4 <li> 5 <div id="post-7" class="list" parent="0" ancestor="">A 6 <span class="my_post_num"></span><span class="my_ancestor_num"></span> 7 </div> 8 </li> 9 10 <li> 11 <div id="post-157" class="list" parent="0" ancestor="">B 12 <span class="my_post_num"></span><span class="my_ancestor_num"></span> 13 </div> 14 <ul class="childrens"> 15 <li> 16 <div id="post-200" class="list" parent="157" ancestor="">C(Bの子) 17 <span class="my_post_num"></span><span class="my_ancestor_num"></span> 18 </div> 19 </li> 20 <li> 21 <div id="post-354" class="list" parent="157" ancestor="">D(Bの子) 22 <span class="my_post_num"></span><span class="my_ancestor_num"></span> 23 </div> 24 </li> 25 <li> 26 <div id="post-365" class="list" parent="354" ancestor="">E(Dの子) 27 <span class="my_post_num"></span><span class="my_ancestor_num"></span> 28 </div> 29 </li> 30 </ul> 31 </li> 32 33 </ul> 34</div>

jQuery

1//先祖番号の連結 2function getParentNums(list) { 3 var parent_num = list.attr('parent'); 4 if (parent_num == "0") { 5 return ["0"]; 6 } 7 var parent = $("#post-" + parent_num); 8 var parent_nums = getParentNums(parent); 9 parent_nums.push(parent_num); 10 return parent_nums; 11} 12$('.list').each(function() { 13 var my_post_num = $(this).attr('id').split('-')[1]; 14 var list = $(this); 15 var parents = getParentNums(list); 16 var my_ancestor_num = parents.join('-'); 17 list.attr('ancestor',my_ancestor_num); 18 //確認のための表示 19 $(this).find('.my_post_num').text(my_post_num); 20 $(this).find('.my_ancestor_num').text(my_ancestor_num); 21}); 22 23//子がいたら「ボタン」表示し、「子の数」を書き換える 24var parents = []; 25$(".list").each(function() { 26 var parent_num = $(this).attr('parent'); 27 parents.push( parent_num ); 28}); 29$(".list").each(function() { 30 $(this).after('<p>子の数:<span class="count-box">0</span></p>'); 31 var my_post_num = $(this).attr('id').split('-')[1]; 32 var my_child_count = (parents.indexOf(my_post_num)).length;//カウントされない? 33 if (parents.indexOf(my_post_num) >= 0){ 34 $(this).append('<button>ボタン</button>'); 35 $(this).find('.count-box').text(my_child_count); 36 } 37}); 38 39 40 41 42 43 44 45 46 47

夜分に長いコードを提示して大変恐縮ではございますが、どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

これは配列parentsからmy_post_numと一致する数をlengthでカウントしているつもりですが、なぜかundifindになってしまいます。

indexOf の理解が誤っているのでは。
indexOfの戻り値は、例えばconst array = [5, 3, 6, 7, 1, 6, 1]のような配列があったとき、
array.indexOf(1)の戻り値は4です。
array.indexOf(2)の戻り値は-1です。

そしてlengthStringまたはArrayのプロパティです。
Numberlengthプロパティはありません。

var my_child_count = (parents.indexOf(my_post_num)).length;
ここでやりたいのはおそらく
var my_child_count = parents.filter(num => num === my_post_num + '').length;
こういうことですよね。

これはparentsという配列からmy_post_numに一致する要素のみ抽出して新しい配列を作り、その長さを取得しています。
parents配列には文字列で数字が入っていたので、my_post_numは文字列に変換して比較しています。
厳密な比較が必要ないなら=== my_post_num + ''のところを=2個にして、== my_post_numにしても良いです。

で、直後のif文も条件式が誤っているので修正すればやりたいことができると思います。

投稿2018/09/03 23:00

spookybird

総合スコア1803

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

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

skipping

2018/09/03 23:31 編集

おはようございます。とても丁寧にご説明頂き誠にありがとうございます。 ご指摘の2点(と、あとcount-box挿入位置)を修正したところ、無事に目的のカウントができました。 indexOfは該当位置を返すのですね。ありがとうございます。次のように誤解しておりました。 すなわち、 『var my_child_count = (parents.indexOf(my_post_num)).length;』 の部分は、 『var my_child_count =(parents の中から、my_post_num に該当するもの)。それを数える』 という指示のつもりでおりました。 なるほど。そうではなく該当位置を返すのなら、たしかにlengthで数えるわけにはいきませんね。理解致しました。ご指導に深く感謝です。 それにしても、 『var my_child_count = parents.filter(num => num === my_post_num + '').length;』 これは難しいですね。 『var my_child_count = parents にフィルターをかける(✕✕という内容で)。それを数える』 しか分かりません。 『num => num』は一体どんな指示になるの?『+』の意味は何なのか?疑問が絶えず…、 もしお時間がございましたらご教示頂けましたら幸いです。 (ご面倒でしたらスルーしてくださって結構です。どうもありがとうございました。)
madoka9393

2018/09/04 01:56 編集

横から失礼いたします。 私もPHPやJavaScript(jQuery)を学習中の身です故、知識確認も含め、可能な範囲でお手伝いさせていただきたく。 先ずは「filter」について、こちらをご確認いただけますと理解が深まるかと思います。 Array.prototype.filter() - JavaScript | MDN - Mozilla https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter ×『num => num』の表記は『key => value』の関係です。 ×この説明で疑問符が浮かぶようであれば、配列についての基礎知識の学習をお勧めいたします。 ⇒申し訳ないです。お恥ずかしながら誤認識でした…。 『+』は変数「my_post_num」と後続の文字列「」(''の中)を連結するためのもの…なのですが、 この比較において「my_post_num」にくっつける意図は私では理解しきれませんでした…。 ⇒回答者様の説明にある通り、「my_post_num」を文字列型に変換するために付与しているのですね。 数値に文字列を連結すると型が変換される(数値型⇒文字列型)ようです。 (変数と文字列の連結自体は基礎知識であるので、こちらも調べてみるとよろしいかと) ご理解の一助になれば幸いです。 #誤認識等ありましたらご指摘いただきたく存じます。
spookybird

2018/09/04 01:18

num => num === my_post_num + '' この記述は「アロー関数」と言います。 (num) => { return num === my_post_num + ''; } このような記述を省略したものです。 numを引数にとり、numと文字列に変換したmy_post_numが一致する場合にtrueを返す関数です。 Array.prototype.filter()の引数は関数で、trueを返した要素だけを名前の通りフィルターします。 「アロー関数」がどういうものかはこちらを参照してください。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions
skipping

2018/09/05 13:48

spookybird様、ご返信遅くなりまして大変申し訳ございません。記述の省略はいろいろ経験しないと難しそうですね。アロー関数についてはリンク先を参照し少しだけわかりました。どうもありがとうございました。 madoka9393様もご考察をありがとうございます。お蔭さまで「filter」について理解理解できました。
guest

0

できたものです。
https://jsfiddle.net/psn5849w/146/

投稿2018/09/03 23:21

編集2018/09/03 23:34
sandwich

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問