質問してみた。今度は自分の回答を載せなかった
住所に変換するアルゴリズムを教えてください
https://oshiete.goo.ne.jp/qa/10391995.html
ary を rst のように変換してみたいのです。
言い訳をするようで何なのだが。
来月来診するまでにダイエットをしなければならない。
甘いものを控えている。そして筋トレ。
頭がくらくらする。
深く考えられないでいる。
そこで質問してみた。
let ary = [ [], [1], [1,2], [1,2,3] ]; let rst = [ '', '1 丁目', '1 丁目 2 番地', '1 丁目 2 番地 3 号' ]; console.log (ary.map (a => a.map ((a, i) => a + [' 丁目',' 番地',' 号'][i]).join (' ')));
ちょっと甘いものを食べて考えた。
上記の動作の逆を考える
let ary = [ '', '1 丁目', '1 丁目 2 番地', '1 丁目 2 番地 3 号', ' 1丁目 ', ' 1丁目 2 番地 ', ' 1丁目2番地 3 ', ' 1 丁目 2 - 3', '1', '1-2', '1-2-3', '2 番地', // × '2 番地 3 号', // × '-2-3'// × ]; let rst = [ [1], [1,2], [1,2,3], [1], [1,2], [1,2,3], [1], [1,2], [1,2,3] ]; console.log ( ary.map (a => /^\s*(\d+)(?:\s*(?:丁目|地割|\-)(?:\s*(\d+)(?:\s*(?:番地|\-)(?:\s*(\d+)(?:\s*号?)?)?)?)?)?\s*$/.exec (a)) .filter (a => !! a) .map (([,...a]) => a.filter (a => !! a).map (a => parseInt (a, 10))) );
体から糖分が抜けきったら、この正規表現は正気の沙汰ではない!と思うのか・・・
実のところを言うと、私の住んでいる町の住所の表記は、”丁目、番地”ではなく ”地割、番地、号”なんだよね。
ちょとだけ見栄をはった。
住所(地割・番地)の入力補助をライブラリ化してみた
住所を入力するときは、ハイフンと半角数字で入力、フォーカスが離れると地割番地に変換される
さっそく考えたコードを組み込んでみた
それにしても ES2015 で書くと便利というか短くかける。
書いた後、見直してさらに短くなる。見直しも楽だ。
<!DOCTYPE html> <html lang="ja"> <meta charset="UTF-8"> <title>住所入力を補助する</title> <style> .tiwari { text-align: right; } </style> <body> <form id="test"> <p>住所 A: <input type="text" name="ADD1" value="" class="tiwari"> <p>住所 B: <input type="text" name="ADD2" value="" class="tiwari"> <p>住所 C: <input type="text" name="ADD3" value="" class="tiwari"> </form> <script> {//住所 地割&番地 const DEF_OPTION = { placeholder : ' 地割 番地 号', splitter : /^\s*(\d+)(?:\s*(?:地割|丁目|\-)(?:\s*(\d+)(?:\s*(?:番地|\-)(?:\s*(\d+)(?:\s*号?)?)?)?)?)?\s*$/, forView : ary => ary.map ((a, i) => a + [' 地割',' 番地',' 号'][i]).join (' '), forEdit : ary => ary.join ('-') }, //整数化 int = ary => ary.filter (a => !!a).map (a => parseInt (a, 10)); const evtFocus = function ({ target }) { let { forEdit, splitter } = this.option, dt = splitter.exec (target.value); if (dt) target.value = forEdit (int (dt.slice (1))); }, evtBlur = function ({ target }) { let { forView, splitter } = this.option, dt = splitter.exec (target.value); if (dt) target.value = forView (int (dt.slice (1))); }; class LocalAddressAssist { constructor (target = null, option = { }) { if (! target) throw new Error ('対象となる要素がありません'); let es = [...target];//コピーと配列化 this.target = new Set (es);//イベントが発生した時に対象の要素か判別する this.option = Object.assign ({ }, DEF_OPTION, option); //option を内部設定値と合成してコピー init: { let doc = es[0].ownerDocument,//最初の要素の document を基準とする ph = this.option.placeholder; doc.addEventListener ('focus', this, true); doc.addEventListener ('blur', this, true); if (ph) {//プレースホルダーをどうするか if ('function' === typeof ph) for (let e of es) e.placeholder = ph (e); else for (let e of es) e.placeholder = String (ph); } } } //イベント handleEvent (event) { let { target } = event; if (this.target.has (target)) { switch (event.type) { case 'focus' : evtFocus.call (this, event); break; case 'blur' : evtBlur.call (this, event); break; } } } } //____________________ this. LocalAddressAssist = LocalAddressAssist; } //____________________________________ let es = document.querySelectorAll ('form input.tiwari'), hoge = new LocalAddressAssist (es); </script>