オブジェクト型の合成(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 _};