投稿日:2024年4月8日

先日、下記のような相談がありました。

企業一覧から所属するグループや、扱っているサービス内容、業種などから絞り込み検索を行いたい。できればAND検索で結果を表示させたい。

以前にも同様の検索機能を実装したことがありますが、AND検索は初めてだったので不安を抱きながら検証してみました。

道筋を立てて考えるてみると、
for文などで表組みの行数を取得し、各行の中から語句の内容を取得。
取得した各行の語句から検索条件全てに合致しているかの判定。
合致した行だけを表示させ、それ以外は非表示にする。
検索条件が空欄(未入力、未選択)の場合の処理。
検索前、検索後に行を1つおきに背景色を付ける。
などが思い浮かびました。

論理的にロジックが思い浮かべられたら実行できる! という確信の元、以下のようなものを作ってみました。

 仕様

全ての項目が空白の場合、検索ボタンをクリックしても何も起きません。
検索項目が1つ以上で絞り込み機能が動作します。
全ての項目を入力した場合、完全一致で表示され、どれか1つでも一致しない場合は表示されません。

ソースコードです。

///////////////////////////////////////////////////////////
// ▼▼▼ 絞り込み検索
///////////////////////////////////////////////////////////
$('input[type="submit"]').click(function () {
  let txtVal = $("#text").val(), //テキスト入力欄
    prefVal = $("#pref").val(), //出身地プルダウン
    representativeWorkVal = $("#representativeWork").val(); //代表作プルダウン
  //全て空欄だったらreturn
  if (txtVal == "" && prefVal == "" && representativeWorkVal == "") {
    return;
  } else {
    //行数分繰り返す
    for (i = 1, paraLen = $("tr").length; i < paraLen; i++) {
      if (
        $("tr").eq(i).html().match(txtVal) && //テキスト入力欄
        $("tr").eq(i).html().match(prefVal) && //出身地プルダウン
        $("tr").eq(i).html().match(representativeWorkVal) //代表作プルダウン
      ) {
        $("tr").eq(i).show(500);
        $(".noMatching").addClass("hide"); //hide付与
      } else {
        $.when($("tr").eq(i).hide(500)).done(function () {
          //一度背景色をリセット
          $("tr").css("background-color", "initial");
          //表示された奇数の行の背景色を#e2e8f9に
          $("tr:visible")
            .not('[class="table_head_tr"]')
            .filter((i, e) => i % 2 === 1)
            .css("background-color", "#e2e8f9");
          // 表示されている行が0だったら「該当はありません。」を表示
          if (
            $("tr").not('[class="table_head_tr"]').filter(":visible").length < 1
          ) {
            $(".noMatching").removeClass("hide"); //hideを削除
          }
        });
      }
    }
  }
});

// ▼▼▼ 全て表示ボタン
$(".allDisplayBtn").click(function () {
  $("tr").show(500);
  $("#text").val(""); //テキスト入力欄
  $("#pref").val(""); //出身地
  $("#representativeWork").val(""); //代表作
  $(".noMatching").addClass("hide"); //hide付与
  //表示された奇数の行の背景色を#e2e8f9に
  $("tr:visible")
    .not('[class="table_head_tr"]')
    .filter((i, e) => i % 2 === 1)
    .css("background-color", "#e2e8f9");
});

9〜10行目。全ての項目が空欄だったらreturnで終了させます。
13行目〜の繰り返し処理でtrタグ数だけ検索内容の有無を判定します。
22行目、$.when() で非表示にしたあと done() で行の背景色を初期化し奇数行に背景色を設定します。
50〜53行目でも表示された奇数行の背景色を設定しています。
それぞれの not('[class="table_head_tr"]') の記述はheader以外を処理対象にするということです。:not()で否定し filter((i, e) => i % 2 === 1) でさらに奇数行に絞り込んでいます。
20、34行目。属性値hideを付与、削除し、CSSの display:none で表示非表示を操作しています。

まとめ

当初、複数の検索内容の全てに合致させる記述で苦労しました。
考え過ぎ、行き詰まってしまったので、一度白紙に戻し作り直しました。
かえってスラスラと書くことができ、案外早く仕上げることができました。
上のサンプル表組みは4行しかありませんが、実際の仕事では二百数十社の掲載があるということです。
これだけの行数で動いてくれるか心配になってきました。。。^^;

なお、本記事で紹介しているソースコードはご自由にお使いいただいても構いませんが、支障が生じても責任は負いませんのでご了承いただきますようお願いいたします。

最後までお読みいただき、ありがとうございます。

Pocket