Screen Shot 2018-11-12 at 18.27.24

atsuco 氏に、焼きそばパンから生姜を抜くように言われたので、JavaScript で抜いてみました。

https://codesandbox.io/s/p7ql8lo8mq

まずは焼きそばパンを作るファンクションを作成します。

このファンクションは、実行時に受ける引数によって焼きそばパンをカスタマイズすることができます。

index.js
const yakisobaPanMaker = ({
  name,
  shoga = true,
  aonori = true,
  mayo = true
}) => {
  return {
    name,
    shoga,
    aonori,
    mayo
  };
};

焼きそばパンメイカーファンクションを実行して、焼きそばパンを作成します。

index.js
const yakisobapan1 = yakisobaPanMaker({
  name: "atsuco"
});
console.log(yakisobapan1);

atsuco 「おい。生姜を抜いてくれ」

JS おじさん 「先に言えや」

index.js
// 最初に言ってくれればこうした
const noShogawaYakisobapan = yakisobaPanMaker({
  name: "atsuco",
  shoga: false
});
console.log(noShogawaYakisobapan);

しょうがないので、生姜を抜いてあげます。生姜無い!

ここで immer というライブラリを使うことで、イミュータブル (immutable) に生姜を抜くことができます。

(つまり yakisobapan1 は生姜がある状態のまま、新たに yakisobapan1noShoga という生姜のない焼きそばパン作成することができます。原価割れです。)

index.js
import immer from "immer";

const yakisobapan1noShoga = immer(yakisobapan1, draft => {
  draft.shoga = false;
});
console.log(yakisobapan1noShoga, yakisobapan1);

atsuco 「もうそもそも生姜という選択肢すら焼きそばパンから削除してほしい」

JS おじさん 「よっしゃ。プロパティなくしたろ」

index.js
const yakisobapan1noShogaProperty = _omit(yakisobapan1noShoga, ["shoga"]);
console.log(yakisobapan1noShogaProperty);

Screen Shot 2018-11-12 at 18.55.37

こういう特殊なオーダーに関しては、焼きそばパンメイカーの方は変更せずに、作成した焼きそばパンオブジェクトに変更を加えたほうがいいと思います。

ただし、このような例外がある焼きそばパンオブジェクトを作ってしまうと、後々、この焼きそばパンオブジェクトの特殊性のせいで意図しないエラーが発生することが予想されるので、できればこのオーダーは断ったほうがいいでしょう。

作業のポイントとしては、immer は存在しないプロパティを追加することはできないので(多分)、lodash の cloneDeep で完全にもう一個焼きそばパンオブジェクトを作った上で、それを変更します。ここまで immutable にする必要は実際はありませんが。

index.js
// なんならマヨネーズも抜いて欲しいし、おかか乗せて欲しい( ˘ω˘ )

import _cloneDeep from "lodash/cloneDeep";

const yakisobapanNoShogaMayo = yakisobaPanMaker({
  name: "atsuco",
  shoga: false,
  mayo: false
});

const cloneYakisobapanNoShogaMayo = _cloneDeep(yakisobapanNoShogaMayo);

cloneYakisobapanNoShogaMayo.okaka = true;
console.log(cloneYakisobapanNoShogaMayo);

以上になります。