辞書データベースサイト(Dict-DB)で、クライアントサイドJavaScriptによる動的フィルタリングを実装した。サーバーサイドのページリロードなしで、即座にフィルタリング結果が表示される。

データ構造:

const DATA = [
  {
    id: 'mongol-khelni-tailbar',
    title: 'モンゴル語解説辞典',
    author: 'Ts.ダムディンスレン',
    year: 1966,
    languages: ['mn'],
    category: 'general'
  },
  // ... 420件以上のエントリ
];

フィルタリングロジック:

3つのドロップダウン(Language、Category、Decade)の組み合わせでフィルタリング:

function filterData() {
  const langFilter = document.getElementById('lang-filter').value;
  const catFilter = document.getElementById('cat-filter').value;
  const decadeFilter = document.getElementById('decade-filter').value;

  const filtered = DATA.filter(item => {
    // 言語フィルタ
    if (langFilter !== 'all' && !item.languages.includes(langFilter)) {
      return false;
    }

    // カテゴリフィルタ
    if (catFilter !== 'all' && item.category !== catFilter) {
      return false;
    }

    // 年代フィルタ
    if (decadeFilter !== 'all') {
      const decade = Math.floor(item.year / 10) * 10;
      if (decade.toString() !== decadeFilter) {
        return false;
      }
    }

    return true;
  });

  renderResults(filtered);
}

結果の表示:

フィルタリング結果をカードレイアウトで表示:

function renderResults(items) {
  const container = document.getElementById('results');

  if (items.length === 0) {
    container.innerHTML = '<p>該当する辞書が見つかりませんでした。</p>';
    return;
  }

  const html = items.map(item => `
    <div class="dict-card">
      <h3>${item.title}</h3>
      <p class="author">${item.author}</p>
      <p class="year">${item.year}年</p>
      <div class="languages">
        ${item.languages.map(lang => 
          `<span class="lang-badge">${lang}</span>`
        ).join('')}
      </div>
      <a href="/dict-db/${item.id}/" class="details-link">詳細を見る</a>
    </div>
  `).join('');

  container.innerHTML = html;
}

初期ソート:

デフォルトでは、最新の辞書が最初に表示される(逆時系列):

DATA.sort((a, b) => b.year - a.year);

パフォーマンス最適化:

420件以上のエントリでも、フィルタリングは瞬時に完了する。配列のフィルタ操作はJavaScriptエンジンで最適化されており、このサイズのデータセットでは十分高速だ。

さらに大規模なデータセットでは、以下の最適化を検討できる:

  1. 仮想スクロール:表示領域のアイテムだけをレンダリング
  2. インデックス化:カテゴリや年代ごとに事前にグループ化
  3. Webワーカー:フィルタリング処理をバックグラウンドスレッドで実行

現在、Dict-DBのフィルタリングは快適に動作している。ユーザーはドロップダウンを変更すると、即座に結果が更新されるのを見ることができる。