テーブルを弄る。その2

> 何か JS 1.8「らしく」ないと言うか…

らしくないように、確かに見えました。
「let」 or 「var」 の使い方というか。
gtlt さんに指摘されて考えたさぁ〜
JS 1.8 にするか、もしくは、従来の方法に戻すか。
迷ったあげく、答えは JS 1.8。
(そうそう、教えてgoo のサンプルには、久慈市に天然ホヤとしましたが、我が町の方が美味しい)
そうそう、その2  visibility: collapse; の「意」がわかりました。こっちですね。

<!DOCTYPE html>
<title></title>

<style type="text/css">
tr[aria-hidden="true"] {
  visibility: collapse;
}
</style>
<form>
  <p>
    <input type="button" value="reset" onclick="table && table.reset ()">
    <select onchange="table && table.find(new RegExp( this.value ), 1)">
      <option value="">-
      <option value="岩手">岩手県
      <option value="青森">青森県
    </select>
    <select onchange="table && table.find(new RegExp( this.value ), 2)">
      <option value="">-
      <option value="市">市
      <option value="町">町
    </select>
    <select onchange="table && table.find(new RegExp( this.value ), 3)">
      <option value="">-
      <option value="おいしい">おいしい
      <option value="おしい">おしい
      <option value="お.*しい">お*しい
    </select>
    
  </p>
</form>

<table border="1" id="hoge">
  <thead>
    <tr>
      <th>No
      <th>Prefecture
      <th>Cities
      <th>Comments
  </thead>
  
  <tbody>
    <tr>
      <td>1
      <td>岩手県
      <td>洋野町
      <td>ウニがおいしい
      
    <tr>
      <td>2
      <td>青森県
      <td>八戸市
      <td>イカがおいしい
    
    <tr>
      <td>3
      <td>岩手県
      <td>久慈市
      <td>美しすぎる海女さんで、おしい
    
    <tr>
      <td>4
      <td>青森県
      <td>八戸市
      <td>美しすぎる市議会議員で、さわがしい

    <tr>
      <td>5
      <td>岩手県
      <td>洋野町
      <td>鮑がおいしい
      
    <tr>
      <td>6
      <td>青森県
      <td>八戸市
      <td>B級グルメ「せんべい汁」がおいしい
    
    <tr>
      <td>7
      <td>岩手県
      <td>洋野町
      <td>天然ホヤがおいしい

</table>

<script type="application/javascript; version=1.8">
(function () { // Asymmetrical JavaScript Abridgment Exclusively

  var getTR = // tr を集める
    (function (collect)
      function (table)
          Array.reduce (table.tBodies, collect, []))

    (function (result, tbody)
      result.concat (Array.slice (tbody.rows, 0)));


  var ariaHidden = // mode によって、それようの関数を返す
    function (mode)
      let (state = String (!!mode))
        function (tr) tr.setAttribute ('aria-hidden', state);

//____________


  var TableViewer = function (node) { // オブジェクト
    this.table = node;
    this.reset ();
  };


  var reset = // 初期化。すべて表示にする
    function ()
      (Array.forEach (getTR (this.table), ariaHidden (false)), this);


  var limit = // 表示数の制限をする
    function (n)
      let (tr = getTR (this.table))
      let (after = Array.slice (tr, n))
        (Array.forEach (after, ariaHidden (true)), this);


  var reverse = // 表示状態を反転する
    (function (toggle)
      function ()
        (Array.forEach (getTR (this.table), toggle), this))

    (function (tr)
      tr.setAttribute ('aria-hidden', String (tr.getAttribute ('aria-hidden') === 'false')));



  var find = // 検索
    (function (checker, setter)
      function (reg, index)
        (Array.forEach (getTR (this.table), checker (reg, index, setter)), this))
    
    (function (reg, index, setter)
      'undefined' === typeof index // index により用途に合った関数を返す
        ? function (tr) (! reg.test (tr.textContent)) && setter (tr) // 行全体で検索
        : function (tr) (! reg.test (tr.cells[index].textContent)) && setter (tr), // セル単体で検索

     ariaHidden (true)); // = setter 非表示用の関数にする
  

  var create =
    function (table)
      ('tagName' in table && 'TABLE' === table.tagName)
        ? new TableViewer (table)
        : null;

//____________

  TableViewer.prototype.reverse = reverse;
  TableViewer.prototype.reset = reset;
  TableViewer.prototype.limit = limit;
  TableViewer.prototype.find = find;

//____________
  this.createTableViewer = create;

})();

var table = createTableViewer (document.getElementById ('hoge'));
</script>