質問してみた。今度は自分の回答を載せなかった

住所に変換するアルゴリズムを教えてください
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>