オブジェクト型の合成

オブジェクト型の合成(merge)

配列同士なら concat する

function merge (a, ...args) {
  let r = Object.assign ({ }, a);
  for (let obj of args) {
    for (let [k, o] of Object.entries (obj)) {
      switch(Object.prototype.toString.call(o).slice(8,-1)) {
        case 'Object': r[k] = merge (r[k]||{}, o); break;
        case 'Array': r[k] = Array.isArray (r[k]) ? r[k].concat(o): o; break;
        case 'Date': r[k]= new Date(o); break;
        default: r[k]=o;break;
      }
    }
  }
  return r;
}

短く

const merge=(a,...b)=>{let r=Object.assign({},a);for(let c of b)for(let[k,o,t=Object.prototype.toString.call(o).slice(8,-4)]of Object.entries(c))r[k]='Obj'==t?merge(r[k]||{},o):'Ar'==t?r[k]=Array.isArray(r[k])?r[k].concat(o):o:'D'==t?new Date(o):o;return r}

再帰で呼び出す場合関数名が被るのでアロー関数にして

const merge=((
  M=(a,...b)=>{
    let r=Object.assign({},a);
    for(let c of b)
      for(let[k,o,t=Object.prototype.toString.call(o).slice(8,-4)]of Object.entries(c))
        r[k]='Obj'==t
        ? M(r[k]||{},o)
        : 'Ar'==t
          ? r[k]=Array.isArray(r[k])?r[k].concat(o):o
          : 'D'==t
            ? new Date(o)
            : o
    return r;
  })=>M)();

renge 関数を短く(最小じゃね?)

const range=(b,e,s=b<e?1:-1,_=[],i=b)=>{for(;_.push(i),i!=e;i+=s);return _};