前提・実現したいこと
現在、rails、jqueryで目の動きに関する診断アプリを作成しております。
質問が全部で35問あり、YES・NOですべての質問に回答し、診断ボタンをクリックするとその人の目の動きの苦手な方向が表示されるようにしています。
各質問のYESの回答に対してclass分けをして、7種類(左上、右上、左側、右側、左下、右下、輻輳開散)に分けています。
それぞれ5問ずつあり5×7で35問です。
7種類の質問に対してYESの数が一番多い種類に紐づく結果が表示できるようにしたいと思っています。
また、YESの数が一番多い種類が複数あった場合には、それぞれの結果を同時に表示させたいです。
例えば、左上の質問に対するYESが一番多ければ、「あなたは左上に目を動かすのが苦手です」という結果を表示。
左上と右上のYESが一番多ければ、「あなたは左上に目を動かすのが苦手です」「あなたは右上に目を動かすのが苦手です」と表示。
発生している問題
YESの数が一番多い種類が一つだけの場合の条件分岐は分かるが、YESの数が一番多い種類が複数あった場合の結果の表示のさせ方の条件分岐が分からないです。
該当のソースコード
rails
1<div class="container"> 2 <div id="wrapper"> 3 <div class="question"> 4 <h1 class="title">かんたん診断</h1> 5 <% @diagnoses.each do |diagnosis| %> 6 <ul class="questions"> 7 <li class="textBox"> 8 <span class="text">Q<%= diagnosis.question_number %>.<%= diagnosis.question_content %></span> 9 <div class="btn-group btn-group-toggle" data-toggle="buttons"> 10 <%= form_with(local: true) do |f| %> 11 <label class="btn btn-secondary"> 12 <%= f.radio_button :question, :yes, class: "#{diagnosis.question_type}" %>YES 13 </label> 14 <label class="btn btn-secondary"> 15 <%= f.radio_button :question, :no %>NO 16 </label> 17 <% end %> 18 </div> 19 </li> 20 </ul> 21 <% end %> 22 <button>診断する</button> 23 </div> 24 <% @diagnosis_results.each do |result| %> 25 <div class="result <%= result.result_type %>(結果)"> 26 <div class="Result_recommend">あなたもしかしたら、こんな目かも</div> 27 <div class="Result_menu"> 28 <div class="Result_menu_text">【<%= result_status(result) %>】</div> 29 </div> 30 <div class="Result_recommend"> 31 <p><%= result_status(result) %>な方は・・・</p> 32 </div> 33 <div class="result-text"> 34 <p><%= result.result_text %></p> 35 </div> 36 <div class="image"> 37 <td><%= image_tag(result.result_picture.url, width: "300px") if result.result_picture? %> 38 </div> 39 </div> 40 <% end %> 41 <div class="results"> 42 <div class="results-text"> 43 <p>目は脳の一部であり、感覚神経や運動神経とつながっています。トレーニングを行う事で、今まで抱えていた悩みを解決できるかもしれません!</p> 44 </div> 45 <div class="result-btn"> 46 <%= link_to "「眼トレ・メントレ・脳トレ」に興味を持った方はこちら!", "#", class: "btn btn-result" %> 47 </div> 48 </div> 49 </div> 50</div> 51 52<script src="index.js"></script>
jquery
1$(function(){ 2 //一度結果を非表示にする 3 $(".result, .results").hide(); 4 //ボタンがクリックされた時 5 $("button").on("click", function(){ 6 //一度結果を非表示にする 7 $(".result, .results").hide(); 8 //問題数を取得 9 var qNum = $("ul.questions li").length; 10 if( $("ul.questions li input:checked").length < qNum ){ 11 //全てチェックしていなかったらアラートを出す 12 alert("未回答の質問があります"); 13 } 14 else { 15 //チェックされているinputの数を取得 16 var typeANum = $(".左上:checked").length, 17 typeBNum = $(".右上:checked").length, 18 typeCNum = $(".左側:checked").length, 19 typeDNum = $(".右側:checked").length, 20 typeENum = $(".左下:checked").length, 21 typeFNum = $(".右下:checked").length, 22 typeGNum = $(".輻輳開散:checked").length; 23 if( typeANum > typeBNum && typeANum > typeCNum && typeANum > typeDNum && typeANum > typeENum && typeANum > typeFNum && typeANum > typeGNum) { 24 $(".左上(結果),.results").fadeIn(); 25 } else if( typeBNum > typeANum && typeBNum > typeCNum && typeBNum > typeDNum && typeBNum > typeENum && typeBNum > typeFNum && typeBNum > typeGNum) { 26 $(".右上(結果),.results").fadeIn(); 27 } else if( typeCNum > typeANum && typeCNum > typeBNum && typeCNum > typeDNum && typeCNum > typeENum && typeCNum > typeFNum && typeCNum > typeGNum) { 28 $(".左側(結果),.results").fadeIn(); 29 } else if( typeDNum > typeANum && typeDNum > typeBNum && typeDNum > typeCNum && typeDNum > typeENum && typeDNum > typeFNum && typeDNum > typeGNum) { 30 $(".右側(結果),.results").fadeIn(); 31 } else if( typeENum > typeANum && typeENum > typeBNum && typeENum > typeCNum && typeENum > typeDNum && typeENum > typeFNum && typeENum > typeGNum) { 32 $(".左下(結果),.results").fadeIn(); 33 } else if( typeFNum > typeANum && typeFNum > typeBNum && typeFNum > typeCNum && typeFNum > typeDNum && typeFNum > typeENum && typeFNum > typeGNum) { 34 $(".右下(結果),.results").fadeIn(); 35 } else if( typeGNum > typeANum && typeGNum > typeBNum && typeGNum > typeCNum && typeGNum > typeDNum && typeGNum > typeENum && typeGNum > typeFNum) { 36 $(".輻輳開散(結果),.results").fadeIn(); 37 } 38 } 39 }); 40});
試したこと
var a = [typeANum, typeBNum, typeCNum, typeDNum, typeENum, typeFNum, typeGNum];
var max = Math.max.apply(null, a);
と書いて、最大値を取得してそれと同じ数のtypeを絞り込み、そのtypeに紐づく結果を表示させられるかとも考えましたが、これ以降の記述の仕方が思いつきませんでした。
「診断アプリ 複数結果」などで調べてみましたが、今のところ参考になるものが見つかっておりません。
どなたかアドバイス頂けると幸いです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.6
rails (5.2.4.5)
jquery-rails (4.4.0)
追記(2021/04/18)
下記の様に、コードを修正しました。
jquery
1 2$(function(){ 3 //一度結果を非表示にする 4 $(".result, .results").hide(); 5 //ボタンがクリックされた時 6 $("button").on("click", function(){ 7 //一度結果を非表示にする 8 $(".result, .results").hide(); 9 //問題数を取得 10 var qNum = $("ul.questions li").length; 11 if( $("ul.questions li input:checked").length < qNum ){ 12 //全てチェックしていなかったらアラートを出す 13 alert("未回答の質問があります"); 14 } 15 else { 16 //チェックされているinputの数を取得 17 var typeANum = $(".左上:checked").length, 18 typeBNum = $(".右上:checked").length, 19 typeCNum = $(".左側:checked").length, 20 typeDNum = $(".右側:checked").length, 21 typeENum = $(".左下:checked").length, 22 typeFNum = $(".右下:checked").length, 23 typeGNum = $(".輻輳開散:checked").length; 24 var a = [typeANum, typeBNum, typeCNum, typeDNum, typeENum, typeFNum, typeGNum]; 25 var max = Math.max.apply(null, a); 26 var eyes = [ 27 { type: "A", Num: typeANum, result: ".左上(結果)" }, 28 { type: "B", Num: typeBNum, result: ".右上(結果)" }, 29 { type: "C", Num: typeCNum, result: ".左側(結果)" }, 30 { type: "D", Num: typeDNum, result: ".右側(結果)" }, 31 { type: "E", Num: typeENum, result: ".左下(結果)" }, 32 { type: "F", Num: typeFNum, result: ".右下(結果)" }, 33 { type: "G", Num: typeGNum, result: ".輻輳開散(結果)" }, 34 ]; 35 36 var filtered = $.grep(eyes, 37 function(element, index) { 38 39 return (element.Num >= max); 40 } 41 ); 42 43 console.log(filtered); 44 var r = $("filtered").val("result"); 45 $("r,.results").fadeIn(); 46 } 47 }); 48});
最大値を取得し、オブジェクトも作成してtypeとresultが紐づくようにしました。
そして最大値とオブジェクトのNumが同数のものを抽出するようにして、YESが一番多いオブジェクトの抽出までは出来ました。(写真はtypeAのYESが一番多かった時のconsole.log(filtered);の結果です)
抽出できた結果の中から、resultの内容を取得できればと思い、
var r = $("filtered").val("result");
という書き方をしましたが、取得ができていないのが現状です。
オブジェクトの中の特定の要素のみを取り出す方法が分かればと思うのですが、どなたかアドバイス頂けたらと思います。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー