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

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

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

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

Q&A

解決済

4回答

1371閲覧

jQueryで複数条件の絞込み検索

ministop

総合スコア17

jQuery

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

0グッド

1クリップ

投稿2017/07/24 07:33

jQueryを使って絞込み検索を作りたいです。
下記コードでor検索はできるようになりました。

全てをor検索ではなく、各hoge-1、hoge-2はor検索、hoge-1とhoge-2間はand検索にしたいです。

例えば、a-2、b-1、b-2にチェックを入れた場合、hogehogeは表示せずにhogeだけ表示したいです。わかりにくくて申し訳ないですがよろしくお願いします。

https://jsfiddle.net/yx92x5bv/1/

###HTML

HTML

1<form> 2 <div class="test"> 3 <div class="hoge-1"> 4 <input type="checkbox" id="a-1"><label class="label" for="a-1">a-1</label> 5 <input type="checkbox" id="a-2"><label class="label" for="a-2">a-2</label> 6 <input type="checkbox" id="a-3"><label class="label" for="a-3">a-3</label> 7 </div> 8 <div class="hoge-2"> 9 <input type="checkbox" id="b-1"><label class="label" for="b-1">b-1</label> 10 <input type="checkbox" id="b-2"><label class="label" for="b-2">b-2</label> 11 <input type="checkbox" id="b-3"><label class="label" for="b-3">b-3</label> 12 </div> 13 </div> 14</form> 15<div class="result"> 16 <section class="a-2 b-1"> 17 <h2>hoge</h2> 18 </section> 19 <section class="a-1 b-2"> 20 <h2>hogehoge</h2> 21 </section> 22 <section class="a-3 b-3"> 23 <h2>hogehogehoge</h2> 24 </section> 25</div>

###jQuery

javascript

1 $(".test input[type=checkbox]").click(function () { 2 showResult(); 3 }); 4 function showResult(){ 5 var showClass = []; 6 $(".test input[type=checkbox]").each(function(){ 7 if($(this).prop('checked')) { 8 showClass.push($(this).prop('id')); 9 } 10 }); 11 $('.result section').hide(); 12 $.each(showClass, function(i, text){ 13 $('.result .'+text).show(); 14 }); 15 16 }

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

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

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

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

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

guest

回答4

0

ベストアンサー

ざっとこんな感じでどうでしょうか?

javascript

1$(function(){ 2 $('.hoge-1,.hoge-2').find('[type=checkbox]').on('change',function(){ 3 $('.result section').hide(); 4 $('.hoge-1').find('[type=checkbox]:checked').each(function(){ 5 var hoge1=$(this).attr('id'); 6 $('.hoge-2').find('[type=checkbox]:checked').each(function(){ 7 var hoge2=$(this).attr('id'); 8 $('.result section').filter(function(){return $(this).hasClass(hoge1) && $(this).hasClass(hoge2);}).show(); 9 }); 10 }); 11 }).trigger('change'); 12}); 13

HTML

1<form> 2<div class="test"> 3<div class="hoge-1"> 4<input type="checkbox" id="a-1"><label class="label" for="a-1">a-1</label> 5<input type="checkbox" id="a-2"><label class="label" for="a-2">a-2</label> 6<input type="checkbox" id="a-3"><label class="label" for="a-3">a-3</label> 7</div> 8<div class="hoge-2"> 9<input type="checkbox" id="b-1"><label class="label" for="b-1">b-1</label> 10<input type="checkbox" id="b-2"><label class="label" for="b-2">b-2</label> 11<input type="checkbox" id="b-3"><label class="label" for="b-3">b-3</label> 12</div> 13</div> 14</form> 15<div class="result"> 16<section class="a-2 b-1"> 17<h2>hoge</h2> 18</section> 19<section class="a-1 b-2"> 20<h2>hogehoge</h2> 21</section> 22<section class="a-3 b-3"> 23<h2>hogehogehoge</h2> 24</section> 25</div>

追記

aにチェックがない場合bだけで判断、bにチェックがない場合aだけで判断という条件を追加

javascript

1$(function(){ 2 $('.hoge-1,.hoge-2').find('[type=checkbox]').on('change',function(){ 3 $('.result section').hide(); 4 $('.hoge-1 [type=checkbox]:checked').each(function(){ 5 var hoge1=$(this).attr('id'); 6 $('.hoge-2 [type=checkbox]:checked').each(function(){ 7 var hoge2=$(this).attr('id'); 8 $('.result section').filter(function(){return $(this).hasClass(hoge1) && $(this).hasClass(hoge2);}).show(); 9 }); 10 }); 11 if($('.hoge-1 [type=checkbox]:checked').length==0){ 12 $('.hoge-2 [type=checkbox]:checked').each(function(){ 13 var hoge2=$(this).attr('id'); 14 $('.result section').filter(function(){return $(this).hasClass(hoge2);}).show(); 15 }); 16 }; 17 if($('.hoge-2 [type=checkbox]:checked').length==0){ 18 $('.hoge-1 [type=checkbox]:checked').each(function(){ 19 var hoge1=$(this).attr('id'); 20 $('.result section').filter(function(){return $(this).hasClass(hoge1);}).show(); 21 }); 22 }; 23 }).trigger('change'); 24}); 25

投稿2017/07/24 09:12

編集2017/07/25 03:18
yambejp

総合スコア114777

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

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

ministop

2017/07/25 02:56

ご回答いただきありがとうございます。 説明不足で大変申し訳ないのですが、 a-1,a-2,a-3(b-1,b-2,b-3)の間では、or検索ができるようにしたいです。 aとbにどちらもチェックが入っていた場合、aとbのand検索にしたいです。 例: ● a-1にチェック hogehoge ● a-1,a-2にチェック hoge,hogehoge ● a-1,a-2,b-1にチェック hoge ● b-2にチェック hogehogehoge ご回答いただければ幸いです。
yambejp

2017/07/25 03:18 編集

aにチェックがない場合はbだけで判断し、bにチェックがない場合はaだけで判断するということですね? 追記しておきました
ministop

2017/07/25 05:52

無事に思ってた通りに動作しました。 ありがとうございます。
guest

0

showResult(); // 初期全てを非表示にするため $(".test input[type=checkbox]").click(function () { showResult(); }); function showResult(){ var $section = $('section'); var $checked_a = $('[id^="a"]:checked'); var $checked_b = $('[id^="b"]:checked'); var _filter = function ($checked) { return function () { var $this = $(this); return Array.prototype.some.call($checked, function (checkbox) { return $this.hasClass(checkbox.getAttribute('id')); }); } }; // 一旦すべてのsectionを非表示にする $section.hide(); // a、bの全てが未選択の場合、処理中断 if (($checked_a.length === 0) && ($checked_b.length === 0)) { return; } // チェックボックスのid属性の値とsectionのクラス属性の値でフィルタリング if ($checked_a.length > 0) { $section = $section.filter(_filter($checked_a)); } if ($checked_b.length > 0) { $section = $section.filter(_filter($checked_b)); } $section.show(); }

https://jsfiddle.net/takmatz/psbz54ad/


修正前

javascript

1showResult(); // 初期全てを非表示にするため 2 3$(".test input[type=checkbox]").click(function () { 4 showResult(); 5}); 6 7function showResult(){ 8 var $section = $('section'); 9 var $checked_a = $('[id^="a"]:checked'); 10 var $checked_b = $('[id^="b"]:checked'); 11 12 var _filter = function ($checked) { 13 return function () { 14 var $this = $(this); 15 16 return Array.prototype.some.call($checked, function (checkbox) { 17 return $this.hasClass(checkbox.getAttribute('id')); 18 }); 19 } 20 }; 21 22 // 一旦すべてのsectionを非表示にする 23 $section.hide(); 24 25 // チェックボックスのid属性の値とsectionのクラス属性の値でフィルタリング 26 $section 27 .filter(_filter($checked_a)) 28 .filter(_filter($checked_b)) 29 .show(); 30}

https://jsfiddle.net/takmatz/jpb08vvp/

投稿2017/07/24 14:23

編集2017/07/25 03:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ministop

2017/07/25 02:55

ご回答いただきありがとうございます。 説明不足で大変申し訳ないのですが、 a-1,a-2,a-3(b-1,b-2,b-3)の間では、or検索ができるようにしたいです。 aとbにどちらもチェックが入っていた場合、aとbのand検索にしたいです。 例: ● a-1にチェック hogehoge ● a-1,a-2にチェック hoge,hogehoge ● a-1,a-2,b-1にチェック hoge ● b-2にチェック hogehogehoge ご回答いただければ幸いです。
guest

0

チェックボックスの状態を調査して、例えば、a-2、b-1、b-2にチェックを入れた場合、下記のようなデータを作ります。

javascript

1var data = { 2 'hoge-1' : ".a-2", 3 'hoge-2' : ".b-1 , .b-2" 4};

つまりカテゴリごとに分けたor条件を作るわけですね。
そしてそのデータを元にfilter()を使えば、and絞り込みができます。

var sec = $("section"); $.each(data,function(key,value){ sec = sec.filter(value);// カテゴリごとに絞り込んでいく }); $("section").hide();// いったん全部消去して… sec.show();// 絞り込みの結果残ったものを表示する

投稿2017/07/24 08:25

zohnam

総合スコア1441

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

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

0

挙がった質問から辿って拝見しました。
こういう質問自分も参加したかったです。

配列の直積を作って解決するパターンを作りましたので参考になれば。
https://jsfiddle.net/sousuke/pLmnwqzv/1/

投稿2018/01/17 09:31

sousuke

総合スコア3828

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問