辞書データベースサイト(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エンジンで最適化されており、このサイズのデータセットでは十分高速だ。
さらに大規模なデータセットでは、以下の最適化を検討できる:
- 仮想スクロール:表示領域のアイテムだけをレンダリング
- インデックス化:カテゴリや年代ごとに事前にグループ化
- Webワーカー:フィルタリング処理をバックグラウンドスレッドで実行
現在、Dict-DBのフィルタリングは快適に動作している。ユーザーはドロップダウンを変更すると、即座に結果が更新されるのを見ることができる。