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

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

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2071閲覧

【JavaScript】アキネーターのような「正解絞り込みクイズ」を設計したい!(完成手前で欠陥を発見・・・)

KentaroxKondo

総合スコア9

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/06/04 08:11

完成手前で欠陥に気がつきました・・・

プログラミング言語(JavaScript)を勉強して1ヶ月ほどの初心者です。噛み砕いてご説明いただけると助かりますm(_ _)m

この度、アキネーターのように、質問に答えることであらかじめ用意された正解が非表示⇨絞られていくプログラムを設計しております。
皆様のお助けをいただき、質問の回答内容に応じて「不正解となる答え」と「不要な設問」が非表示となる、以下のコードを組むことができました。

HTML

1<body> 2 3 <div id="Questions"><h1>質問</h1> 4 5 <div id="Q1"> 6 <p>Q. 生きていますか?</p> 7 <label><input type="radio" name="RadGrpA1" id="A1Yes">YES</label> 8 <label><input type="radio" name="RadGrpA1" id="A1No">No</label> 9 <label><input type="radio" name="RadGrpA1">わからない</label> 10 </div> 11 12 <div id="Q2"> 13 <p>Q. 首が長いですか?</p> 14 <label><input type="radio" name="RadGrpA2" id="A2Yes">YES</label> 15 <label><input type="radio" name="RadGrpA2" id="A2No">No</label> 16 <label><input type="radio" name="RadGrpA2">わからない</label> 17 </div> 18 19 <div id="Q3"> 20 <p>Q. 植物ですか?</p> 21 <label><input type="radio" name="RadGrpA3" id="A3Yes">YES</label> 22 <label><input type="radio" name="RadGrpA3" id="A3No">No</label> 23 <label><input type="radio" name="RadGrpA3">わからない</label> 24 </div> 25 26 <div id="Q4"> 27 <p>Q. トゲがありますか?</p> 28 <label><input type="radio" name="RadGrpA4" id="A4Yes">YES</label> 29 <label><input type="radio" name="RadGrpA4" id="A4No">No</label> 30 <label><input type="radio" name="RadGrpA4">わからない</label> 31 </div> 32 33 <div id="Q5"> 34 <p>Q. 人間ですか?</p> 35 <label><input type="radio" name="RadGrpA5" id="A5Yes">YES</label> 36 <label><input type="radio" name="RadGrpA5" id="A5No">No</label> 37 <label><input type="radio" name="RadGrpA5">わからない</label> 38 </div> 39 40 <div id="Q6"> 41 <p>Q. ミュージシャンですか?</p> 42 <label><input type="radio" name="RadGrpA6" id="A6Yes">YES</label> 43 <label><input type="radio" name="RadGrpA6" id="A6No">No</label> 44 <label><input type="radio" name="RadGrpA6">わからない</label> 45 </div> 46 47 <div id="Q7"> 48 <p>Q. 実在しますか?</p> 49 <label><input type="radio" name="RadGrpA7" id="A7Yes">YES</label> 50 <label><input type="radio" name="RadGrpA7" id="A7No">No</label> 51 <label><input type="radio" name="RadGrpA7">わからない</label> 52 </div> 53 54 </div> 55 56 <h1>正解可能性</h1> 57 <p id="Cabbage">キャベツ</p> 58 <p id="Cactus">サボテン</p> 59 <p id="Elephant">象</p> 60 <p id="Giraffe">キリン</p> 61 <p id="MichaelJackson">マイケルジャクソン</p> 62 <p id="NobunagaOda">織田信長</p> 63 64</body>

JavaScript

1const AutoJudgement = () => { 2 3 let Judge = {Cabbage:"", Cactus:"", Elephant:"", Giraffe:"", MichaelJackson:"", NobunagaOda:""}; 4 let JudgeArray = ["Cabbage", "Cactus", "Elephant", "Giraffe", "MichaelJackson", "NobunagaOda"]; 5 6       //各選択肢(Response)を選択した際に、正解可能性リストから除外する項目をOmitにまとめています 7 const ResponseAndProcess = [ 8 {Response:"A1Yes", Omit:["Cabbage","Cactus"]}, 9 {Response:"A1No", Omit:["Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 10 {Response:"A2Yes", Omit:["Cabbage","Cactus","Elephant","MichaelJackson","NobunagaOda"]}, 11 {Response:"A2No", Omit:["Giraffe"]}, 12 {Response:"A3Yes", Omit:["Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 13 {Response:"A3No", Omit:["Cabbage","Cactus"]}, 14 {Response:"A4Yes", Omit:["Cabbage","Elephant","Giraffe","MichaelJackson","NobunagaOda"]}, 15 {Response:"A4No", Omit:["Cactus"]}, 16 {Response:"A5Yes", Omit:["Cabbage","Cactus","Elephant","Giraffe"]}, 17 {Response:"A5No", Omit:["MichaelJackson","NobunagaOda"]}, 18 {Response:"A6Yes", Omit:["Cabbage","Cactus","Elephant","Giraffe","NobunagaOda"]}, 19 {Response:"A6No", Omit:["MichaelJackson"]}, 20 {Response:"A7Yes", Omit:[""]}, 21 {Response:"A7No", Omit:["Cabbage", "Cactus", "Elephant", "Giraffe", "MichaelJackson", "NobunagaOda"]}, 22 ]; 23 24 //各Responseが選択された場合に、対応するOmitの各コンテンツに対して「不正解」という値を付与する 25 for (let i=0; i<ResponseAndProcess.length; i++) { 26 if (document.getElementById(ResponseAndProcess[i].Response).checked) { 27 for (let j=0; j<ResponseAndProcess[i].Omit.length; j++) { 28 Judge[ResponseAndProcess[i].Omit[j]] = "不正解"; 29 } 30 } 31 } 32 33       //「不正解」値を持つ正解可能性リストに対して「ZeroPossibility」クラスを付与する(CSSで非表示にします) 34 for (let i = 0; i < JudgeArray.length; i++) { 35 if (Judge[JudgeArray[i]] == "不正解") { 36 document.getElementById(JudgeArray[i]).classList.add("ZeroPossibility"); 37 } else { 38 document.getElementById(JudgeArray[i]).classList.remove("ZeroPossibility"); 39 } 40 } 41 42 //Omitの持つコンテンツを、これ以上正解可能性リストから除外することができない場合(回答を絞り込むうえで質問が役に立たなくなった場合)に、設問のdiv自体にも「ZeroPossibility」クラスを付与し、CSSで非表示にする 43 document.querySelectorAll('#Questions > div').forEach(el => el.classList.remove("ZeroPossibility")) 44 const Possibilities = Object.entries(Judge).flatMap(e => e[1] === "不正解" ? [] : e[0]); 45 const ZeroPossibilityResponses = ResponseAndProcess.flatMap(e => Possibilities.every(x => !e.Omit.includes(x)) ? e.Response : []) 46 ZeroPossibilityResponses.forEach(opt => { 47 const $Options = document.getElementById(opt); 48 if(!$Options.checked){ 49 $Options.closest('div').classList.add('ZeroPossibility') 50 } 51 }); 52 53}; 54 55document.getElementById("Questions").addEventListener("change", () => { 56 AutoJudgement(); 57});

上記により、どの質問からも回答することができ、なおかつ不要な質問には答えなくて済むので、最短手数でユーザーを正解に導くUIができました。

しかし、完成手前でひとつの欠陥に気がつきました。それは、**「Omitが空っぽ("")となる選択肢が存在する場合に、有無を言わさずその設問が非表示にされてしまう」**という問題です。

例えば、例示用に追記した「実在しますか?」という問いの「A7Yes」は、Omitが空です。そのため、仮に「A7No」が問題の切り分けに有効な質問であったとしても、「A7Yes」が空であることに引っ張られて、どのラジオボタンを選択しても常に問7が非表示にされてしまいます。

teratail用に記載したこの質問例とは別のシチュエーションで、「Yes」なら一切の切り分けができないけれども「No」ならば正解の切り分けに有効な質問に、実際に直面しております。

「Omitが空っぽである」という理由で、設問が丸ごと非表示にされてしまうのを防ぐにはどうすれば良いでしょうか?

「設問自体を変えよう」という回答はなしで、上記をプログラム的に実現する方法をご教示いただければ幸いです。

皆様のお助けに心から感謝いたします!

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

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

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

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

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

Lhankor_Mhy

2021/06/04 08:21

どういう質問を非表示にしたいのか、要件を示してください。
KentaroxKondo

2021/06/04 08:24

>K_3578様 簡潔に記載できず申し訳ございません。悩んだのですが、要約する語彙を持ち合わせておりませんでした。リンクを共有いただきありがとうございます。
K_3578

2021/06/04 08:30

質問者さんがこの質問によって解消したい疑問点は何ですか? 「Omitが空っぽ("")となる選択肢が存在する場合に、有無を言わさずその設問が非表示にされてしまう」 ですよね?それを簡潔に書くだけです。 申し訳ないのですが、このタイトルには情報が何も入っていません。 回答者にとってはアキネイターを作っていようが他のゲームを作ってようが関係はないですし、 完成直前で云々も正直どうでも良いことです。 気持ちは分からなくもないですが、書くとしても質問文の文末にでもさらっと書くぐらいで良いかと。
KentaroxKondo

2021/06/04 08:35

>Lhankor_Mhy様 いつもコメントいただきありがとうございます。また私の説明が至らず申し訳ございません。 質問に対するYesもしくはNoのいずれかが、残った正解可能性をひとつでも削ることができる場合は、質問する価値があるとみなし、表示状態にさせたいです。 実のところを申し上げると、上記の例とは異なり、実際は「トラブルシューティング」で起きた問題の原因を切り分けるプログラムを作成しております。 その中で、「Yes」ならばどの可能性も残るけれども、「No」ならば一部の可能性を除外する質問が存在することに気がついたのです。 上記のコードではYes/Noの一方のOmitが空っぽ(””)の場合に、もう一方の選択肢が問題切り分けに有効でも設問が丸ごと消えてしまうため、これを回避したく取り組んだのですが、方法が浮かばずteratailに助けを求めた次第です。
Lhankor_Mhy

2021/06/04 08:38

> 質問に対するYesもしくはNoのいずれかが、残った正解可能性をひとつでも削ることができる場合 正解可能性がA、B、C Yes の omit が D No の omit が A、B、C である場合は、No は正解可能性を削ることができるので、質問は表示していいですか?
KentaroxKondo

2021/06/04 08:39

>K_3578 まったくおっしゃる通りです。回答者様にとって意味のないタイトルで妥協し投稿してしまい申し訳ございません。ご指摘いただきありがとうございます。極力意味のあるタイトルをつけて、簡潔な内容を書くよう気をつけます。
KentaroxKondo

2021/06/04 08:44

>Lhankor_Mhy はい! 残った正解可能性配列から、ひとつでも削ることができる場合は質問として尋ねる意味があるとみなし、表示状態にしたいです。 (プログラミングの勘が鈍いので、もしも別の問題が発生するようでしたらご教示いただけると幸いです・・・)
K_3578

2021/06/04 08:46

別にタイトルに限らずですよ。タイトルでも書いてる完成直前云々を見出しで書かれても 「で、質問は?」ってなりますし。 質問文書くの苦手なら基本テンプレートを埋めるだけでもかなり見やすくなります。 一度試してみてください。
Lhankor_Mhy

2021/06/04 08:47

正解がなくなってしまう質問でもかまわない、ということになります。 たとえば、「動物?」にYesとした時に「植物?」は表示でよい、という理解で合っていますか? コードの書き方は助言しますが、論理の組み立ては貴方がやるしかないので、もう少しがんばってください。
KentaroxKondo

2021/06/04 08:56

>Lhankor_Mhy様 >たとえば、「動物?」にYesとした時に「植物?」は表示でよい、という理解で合っていますか? すみません。混乱していました>< 上記の場合は「植物?」が表示されるのはよくないですね・・・。 現在仕上がっているコードで、問7以外の部分の動きはパーフェクトです! 負んぶに抱っこ状態ですみませんが、問7のOmitが空(””)であることにひっぱられてしまう問題のみを改善することはできないでしょうか。
Lhankor_Mhy

2021/06/04 09:11

ロジックには関与しなくていい、ということですね。 了解しました。
KentaroxKondo

2021/06/04 09:41

>Lhankor_Mhy 私の頭が足りず、必要事項の確認に時間をとってしまいすみませんm(_ _)m どうかよろしくお願いいたします。
guest

回答1

0

ベストアンサー

問7のOmitが空(””)であることにひっぱられてしまう問題のみを改善する

以下でどうでしょうか。

js

1 ResponseAndProcess.flatMap(e => e.Omit[0] == "" && e.Omit.length == 1 ? e.Response : []).forEach(opt => { 2 const $Options = document.getElementById(opt); 3 $Options.closest('div').classList.remove('ZeroPossibility') 4 });

いつ処理をしても同じ結果になるので、ResponseAndProcess.flatMap(e => e.Omit[0] == "" && e.Omit.length == 1 ? e.Response : [])は先に計算して定数として持っておいた方が効率的ですね。


蛇足ですが、一般的には空の配列は[]です。
要素数0の配列を空配列と呼ぶことが多いので、[""]は空文字列を要素としている要素数1の配列であって、空の配列とは言いにくいと思います。

投稿2021/06/04 10:26

Lhankor_Mhy

総合スコア36074

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

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

KentaroxKondo

2021/06/04 10:55

>Lhankor_Mhy様 早速ご回答いただきありがとうございます! 提示いただいたコードが、Omitの中身が””の場合のResponseを取り出し、Responseの親となるdivから「ZeroPossibility」クラスを取り除いていることまでは理解ができました。 しかし、私の理解力ではここから先の応用が難しかったです・・・ 単純に上記をそのままコードの末尾に付け足すと、””のOmitを含む設問は「常に表示」状態となりました。 しかし、Yes/Noの「両方とも」が、答えの切り分けに役立たなくなった場合には、設問を非表示にしたいですm(_ _)m 例えば、仮にQ7が以下だとしたら、「生きていますか?>A1Yes」を選択した際にはQ7も非表示になってほしいのですが、どのように応用すればよいかご教示いただけますととても嬉しいです。 {Response:"A7Yes", Omit:[""]}, {Response:"A7No", Omit:["Cabbage", "Cactus"]}, 何度もご面倒をおかけし申し訳ございませんm(_ _)m 配列についても教えていただきありがとうございます!
Lhankor_Mhy

2021/06/04 11:37

ロジックには関与しない、と申し上げたはずですが…… 非表示にする条件を示してください。
KentaroxKondo

2021/06/04 12:24

度々すみません・・・m(_ _)m 現在仕上がっているコードでは、Omitが正解可能性リストからこれ以上除外する項目を持たない場合に、Omitの対となるResponseの親divに対して非表示用のクラスを付与していますよね・・・ 例えばこの処理の過程で、「そもそものOmit設定が[“”]の場合には、非表示クラスをふる判定は何も行わずに、スキップする」ような追記をすることは可能でしょうか。Omitに””の選択肢がある設問を除いては完璧に意図した通りの動きになっているので、Omitが""の場合にも判定が下されてしまうことのみを回避したいです。 プログラミング的に正解なロジック?や条件を導くことが難しいのですが、以下の状況を実現したいと強く願っております・・・ 例: {Response:"A7Yes", Omit:[""]}, ←ここが空の場合は、非表示クラスの付与判定を行わない {Response:"A7No", Omit:["Cabbage", "Cactus"]}, ←Omitに中身がある場合にのみ、設問7の表示・非表示を判定し適宜クラスをふる なお、Omitの中身は[]でも[“”]でもどちらでも良いですm(_ _)m 論理の組み立て方が違っていても、理想の結果となればうれしいです! すみませんが、よろしくお願いいたしますm(_ _)m
KentaroxKondo

2021/06/04 23:08

>Lhankor_Mhy様 1日空けて再考してみました。ご提供いただいた式を、もともとの式に追加条件として組み込もうと試みたのですが、以下の式が出来上がりました。 ーーーーーーーーーーーーーーーーーーーー document.querySelectorAll('#Questions > div').forEach(el => el.classList.remove("ZeroPossibility")) const Possibilities = Object.entries(Judge).flatMap(e => e[1] === "不正解" ? [] : e[0]); const ZeroPossibilityResponses = ResponseAndProcess.flatMap(e => e.Omit[0] == "" && e.Omit.length == 1 ? []: Possibilities.every(x => !e.Omit.includes(x)) ? e.Response : []) ZeroPossibilityResponses.forEach(opt => { const $Options = document.getElementById(opt); if(!$Options.checked){ $Options.closest('div').classList.add('ZeroPossibility') } }); ーーーーーーーーーーーーーーーーーーーー ※「e.Omit[0] == "" && e.Omit.length == 1 ? []:」という部分を追加しています。 結果として、問7は選択の状況に応じて表示・非表示が切り替わるようになりました。 しかし、問7の設定が以下の場合、「生きてる?」>No、「トゲがある?」>Yesの時点で、答えは「サボテン」一択に絞られているのに、問7が非表示になってくれません。 {Response:"A7Yes", Omit:[""]}, {Response:"A7No", Omit:["Cabbage", "Cactus"]}, 上記の処理は生かしつつ、「ZeroPossibility」クラスがふられていない正解可能性リストが一つになった時点で、チェックがついていないラジオボタンの設問を全て非表示にする処理を後ろに追記したら、この問題は改善するでしょうか・・・
Lhankor_Mhy

2021/06/05 00:35

きちんと検討していませんが、抜け穴がありそうな気がします。そういうアドホックな処理は後からバグの温床になりそうです。
KentaroxKondo

2021/06/05 00:51

>Lhankor_Mhy様 ご回答ありがとうございます!上記のような付け焼き刃的方針だと、バグのリスクが高まるのですね… ベターな回避策があれば教えていただきたいのですが、難しいでしょうか・・・><
Lhankor_Mhy

2021/06/05 01:22

すぐに実装をしようとせずに、落ち着いてルールを決めるところからやった方がいいと思いますよ。 補足依頼のコメントを読む限り「質問に対するYesもしくはNoのいずれかが、残った正解可能性をひとつでも削ることができる場合は、質問する価値があるとみなし、表示状態にさせたい」かつ「質問に対するYesもしくはNoのいずれかが、正解可能性がなくなってしまう場合は、非表示」であるように読めるのですが、これは検討したのですか? この他にルールはないのですか? たとえば、 正解可能性 A,B,C Yes Omit A No Omit A,B,C の場合はどうなるのですか? 表示するのですか?しないのですか? それとも、Yes と No は排他なので考慮しなくていいのですか?
Lhankor_Mhy

2021/06/05 01:27

前々回の質問でも、しつこくお聞きしているので気を悪くされたら申し訳ないのですが、間違ったルールを基にコードを書いても無駄なのです。 (実際に、前々回の回答も、この回答のコードも、無駄になりましたよね?) 無駄だから嫌いなんだ。無駄無駄……
KentaroxKondo

2021/06/05 03:16

>Lhankor_Mhy様 こちらこそ、毎度のことながらお手間をおかけしてしまい申し訳ございません。コメントいただけることに心から感謝しております!無駄を発生させてしまい申し訳ございませんが、過去にいただいたご回答はすべて非常に勉強になりましたm(_ _)m ーーーーーーーーーーーーーーーーーーーー 例1: 正解可能性 A,B,C Yes Omit A No Omit A,B,C ーーーーーーーーーーーーーーーーーーーー 上記の質問を用意すると、Yesと答えてもNoと答えても、正解から「A」が必ず除外されてしまうので、それであれば最初から「正解リスト」に絶対に正解となり得ない「A」を含めていることがおかしいです。この場合は、プログラミング以前に、問題や正解リストの設定自体に不良があるとみなして対応します。 というわけで、YesとNoのOmit内に、値が重複することは絶対にあり得ません。 しかし、次のような結果をもたらす質問は、現実的に起こり得ます。 ーーーーーーーーーーーーーーーーーーーー 例2: 正解可能性 A,B,C Yes Omit (何も切り分けできない) No Omit A,B ーーーーーーーーーーーーーーーーーーーー そして、現在起きている問題は、例2の質問が、すでに正解が一択にまで絞られている場合(例3)にも「表示」状態になってしまうことです。 ーーーーーーーーーーーーーーーーーーーー 例3: 正解可能性 A Yes Omit (何も切り分けできない) No Omit A,B ーーーーーーーーーーーーーーーーーーーー ↑正解可能性がAのみになったのなら、それ以上の絞り込みは必要がないので、この問いも非表示にしたいのですが、「最後の1択を潰すことができるかもしれない!」とプログラムが認識しているためか、このシチュエーションでも設問が表示状態となってしまいます。 精一杯の情報を伝えているつもりなのですが、不足した情報があればおっしゃってくださいm(_ _)m
KentaroxKondo

2021/06/05 03:20

「質問に対するYesもしくはNoのいずれかが、残った正解可能性をひとつでも削ることができる場合は、質問する価値があるとみなし、表示状態にさせたい」と述べましたが、正解可能性が残り1択になったのならば、その1択を削るかどうかまでの判断は下さなくて良いので、1択に絞られた状態で残りの設問はすべて非表示になる動きが理想です。語弊のある言い方をしてしまい申し訳ございません。
Lhankor_Mhy

2021/06/05 03:25

では、 正解可能性 "Cabbage","Cactus" Yes Omit なし No Omit "Cabbage","Cactus" という質問は表示する、ということでいいのですね?
KentaroxKondo

2021/06/05 03:35

>Lhankor_Mhy様 そうですね! 質問の最終地点としては、以下の2パターンがあります。 ①答えが1択にまで絞り込まれる(絞り込み成功) ②全ての正解可能性が消えてしまい、用意していない「未知の正解」が存在することにして逃げる(絞り込み失敗) ーーーーーーーーーーーーーーーーーーーー 正解可能性 "Cabbage","Cactus" Yes Omit なし No Omit "Cabbage","Cactus" ーーーーーーーーーーーーーーーーーーーー この状況で質問を非表示にしてしまうと、正解が2つあるままで放置されるので、残念ですが②に辿り着きました!という動きになった方が嬉しいです!(つまり、この状況ならばユーザーには質問に答えて欲しいので、質問を「表示」させます!)
KentaroxKondo

2021/06/05 03:38

本当にごめんなさい、、笑 この質問、Yesと答えられた場合は正解可能性が2つ残ることになりますが、それは仕方がないので許してください!
Lhankor_Mhy

2021/06/05 03:40

なるほど、そういうルールでしたら、KentaroxKondo さんご提示の方法でいいのではないかと思いますよ。
Lhankor_Mhy

2021/06/05 03:41

あ、いや、うーん、違うかも。
Lhankor_Mhy

2021/06/05 03:43

正解可能性 A,B,C Yes Omit D No Omit A,B の場合は、非表示ですか?
KentaroxKondo

2021/06/05 03:47

その場合は「表示」させたいです! ユーザーがYesと答えたら絞り込みの役には立ちませんが、ユーザーがNoと答えたら、AとBを除外し1択にまで絞り込むことができるので、選択肢によっては質問する意義があるからです。
Lhankor_Mhy

2021/06/05 03:52

とすると、KentaroxKondo さんが書かれたコードはダメですね。Omit が何もないことを条件としているので。 --- しつこくて申し訳ないのですが、 正解可能性 "Cabbage","Cactus" Yes Omit なし No Omit "Cabbage","Cactus" これは表示とのことでしたが、 正解可能性 "Cabbage","Cactus" Yes Omit "Elephant", "Giraffe", "MichaelJackson", "NobunagaOda" No Omit "Cabbage","Cactus" これは表示ですか?
KentaroxKondo

2021/06/05 04:27

ーーーーーーーーーーーーーーーーーーーー ① 正解可能性 "Cabbage","Cactus" Yes Omit なし No Omit "Cabbage","Cactus" ーーーーーーーーーーーーーーーーーーーー ーーーーーーーーーーーーーーーーーーーー ② 正解可能性 "Cabbage","Cactus" Yes Omit "Elephant", "Giraffe", "MichaelJackson", "NobunagaOda" No Omit "Cabbage","Cactus" ーーーーーーーーーーーーーーーーーーーー →非常にわかりやすくまとめていただいてありがとうございます。私自身が混乱気味なので、非常にご迷惑をおかけしていますよね・・・ おかげさまで気付かされましたが、②のような場合に質問を「表示」としてしまうと、全体的に正解が絞り込まれている感が少なく、無駄な質問にばかり回答を求められる印象のUIになってしまいますよね・・・それはまずかったです。 ②を非表示として、①を表示にするという考えがめちゃくちゃな論理であることが見えてきました。 ①と②がともに「表示」「非表示」の一方にならざるを得ないのならば、やはり最終的に選択肢が複数残る可能性はありますが、「サクサク絞り込まれている感」を重視してどちらも「非表示」とした方がメリットがあるかなと思いました。(二転三転してすみません。。。) 実際に不便だと感じているのは、以下のように回答が1択に定まったのにも関わらず、設問が「表示」されてしまうことです。ここさえクリアできれば、現状の他の設問を答えた際の動きは完璧に機能しているのですが・・・ ーーーーーーーーーーーーーーーーーーーー 正解可能性 "Cactus" Yes Omit "" No Omit "Cabbage","Cactus" ーーーーーーーーーーーーーーーーーーーー
KentaroxKondo

2021/06/05 15:53

初心者の汚い力わざ感が否めないですが・・・ 試しに「正解可能性が1択まで絞られた場合に、未選択の設問を非表示にする」付け焼き刃的な理屈でも試し書きしてみました。賢い書き方がわからず、無駄が多そうな見た目になりましたが、一応動いてはくれているようです・・・ const PossibleAnswersMaxLength = document.getElementById("PossibleAnswers").getElementsByTagName("p").length; const ImpossibleAnswersLength = document.getElementById("PossibleAnswers").getElementsByClassName("ZeroPossibility").length; if (PossibleAnswersMaxLength - ImpossibleAnswersLength == 1) { const AllResponses = ResponseAndProcess.flatMap(e => e.Response); AllResponses.forEach(opt => { const $Options = document.getElementById(opt); if(!$Options.closest("div").classList.contains("ZeroPossibility") && !$Options.checked) { $Options.closest("div").classList.add("ZeroPossibility"); } }); AllResponses.forEach(opt => { const $Options = document.getElementById(opt); if ($Options.checked){ $Options.closest("div").classList.remove("ZeroPossibility"); } }); }; これで想定されるバグなどがあればご教示いただけると幸いです。 理屈がこれで問題なければ、リファクタリング依頼のために別の質問を投稿しようかと考えていますm(_ _)m
Lhankor_Mhy

2021/06/08 01:42

周辺のコードにもよると思いますが、コードを読む限りでは、問題なさそうな気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問