◆ オブジェクト操作メモ
◆ ... オペレータとか

Object.assign でマージできる
最初の引数に 2 つ目以降ので上書き
const a = {x:1}
Object.assign(a, {y:1})
console.log(a)
// {x: 1, y: 1}

最初の引数を空オブジェクトにすることでマージしたものを新しいオブジェクトとして作れる(非破壊的)
const b = {p:1}
const c = Object.assign({}, b, {q:1})
console.log(b)
// {p: 1}
console.log(c)
// {p: 1, q: 1}

リテラルで定義するときに 他のオブジェクトをマージするなら spread operator (...)
const d = {u:2}
const e = {v:1, ...d}
console.log(e)
// {v: 1, u: 2}

後に書いたもので上書きされる
const f = {s:1, ...{s: 2, t: 3}, t: 4}
console.log(f)
// {s: 2, t: 4}

const f2 = {t:4, ...{s:2, t: 3}, s:1}
console.log(f2)
// {t:3, s:1}

{a: a} を {a} と書ける機能と混ぜる
const g = {a:1, b:2, c:3}
const h = 4
const i = {...g, h}
console.log(i)
// {a: 1, b: 2, c: 3, h: 4}

新しいオブジェクトへマージ(非破壊的)
const j = {a: 1, b: 2}
const k = {x: 3, y: 4}
const l = {...j, ...k}
console.log(l)
// {a: 1, b: 2, x: 3, y: 4}

x, y プロパティだけ別にする
const m = {a: 1, b: 2, x: 3, y: 4, z: 5}
const {x, y, ...n} = m
console.log(n)
// {a: 1, b: 2, z: 5}

var 限定 いらないものをスコープに作らない
_ はいらないもの置き場扱い
const m = {a: 1, b: 2, x: 3, y: 4, z: 5}
var {x: _, y: _, ...n} = m
console.log(n)
// {a: 1, b: 2, z: 5}
var {z: _, ...o} = n
console.log(o)
// {a: 1, b: 2}

do 式が使えたら
const m = {a: 1, b: 2, x: 3, y: 4, z: 5}
const n = do {
const {a, b, ...partial} = m
partial
}


オブジェクトの ... オペレータをうまく使えば 簡単にオブジェクトもイミュータブルとして扱えそう