気になる点
既にクローズされていますが、まだ考える余地が残っているように思われます。
まず、一見して気が付いた点がいくつか。
- 複数の子を持つので、
child
ではなく、children
- 名前から一意な識別子に読める
id
が複数存在 -> groupId
or class
に改名
- サイトマップなのに、URLがない
- URL基準で階層化する機構がない
- 階層化する基準が不明 -> リンクを辿った時の同線?
- 命名されているプロパティ名がDOMに似ている
要求仕様
要求仕様が不明なので、「私なら」という前提がつきますが。
- 階層化基準はリンクを辿る順番
linkPathList
プロパティを定義し、サイトマップ上の場所を表す(a>b>cの順で行く場合、/a/b/c
のパス形式で表す。該当ページに複数のアクセス方法がある可能性がある為、linkPathは配列形式で複数格納)
url
プロパティを定義
id
は一意な識別子とし、getElementById
に相当するAPIを用意する
- 必要であれば、グループ識別子となる
classId
も用意する(用途不明の為、詳細には触れず)
- localStrageには二次元配列をJSON化かして格納する
- localStrageから取り出す時には独自オブジェクト形式に変換する(
class
構文を利用)
JSONではオブジェクトは {}
, []
の二種類しか存在できない為、拡張性が貧弱です。
JSONから取り出したデータは中間オブジェクトと割り切り、APIを遣える形式に変換してやると扱いやすくなります。
実装案
具体的には下記の形式で localStrage に格納し、
JavaScript
1const siteMapArray = [
2 ['id','url','title','linkPathList'],
3 ['root','http://example.com/','example',['/']],
4 ['foo1','http://example.com/foo1.html','Hello, foo1!',['/foo1']],
5 ['foo2','http://example.com/foo2.html','Hello, foo2!',['/foo1/foo2','/sitemap/foo2']],
6 ['foo3','http://example.com/foo2/foo3.html','Hello, foo3!',['/foo1/foo2/foo3','/sitemap/foo3']],
7 ['piyo','http://example.com/piyo.html','piyo, piyo!',['/piyo','/sitemap/piyo']],
8 ['sitemap','http://example.com/bar.html','サイトマップ','/sitemap']
9];
10
11localStorage.setItem('siteMap', JSON.stringify(siteMapArray));
下記のように、DOM APIに似たインターフェースを持つ class SiteMap
を定義します。
JavaScript
1localStorage.setItem('siteMap', JSON.stringify(siteMapArray));
2
3const siteMap = new SiteMap(JSON.parse(localStorage.getItem('siteMap')));
4
5console.log(siteMap.getPageById('foo3').title); // "Hello, foo3!"
6console.log(siteMap.getPageByLinkPath('/sitemap/piyo').title); // "piyo, piyo!"
7console.log(siteMap.rootPage.url); // "http://example.com/"
8console.log(siteMap.rootPage.children[0].children[0].linkPathList); // ['/foo1/foo2','/sitemap/foo2']
内部的には、id
, linkPath
をキーに持つ new Map
を持っておけば、getPageBy***
を実装できます。
一次元データ、二次元データで持っておくと、なにがしかの識別子を元に検索するのが楽になります。
children
の親子関係はlinkPathを元に検索して子を定義していくか、new Proxy
でプロパティ参照される度に動的に探します。
Re: labo さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/05 02:15
2019/07/05 02:30
2019/07/05 06:21