JavaScriptでObjectをディープコピーする

どうもnibosiです、最近jestでテストを書いていてドハマりした結果、
Object.assign()を全然理解していなかった事が判明したので忘れないうちに記事にしました。( ;∀;)

Object.assign()はシャローコピー

もう答えが出てしまっていますが…そうなんです。
Object.assign()はシャローコピーだったのです…( ;∀;)

MDNにもちゃんとのってますね ヽ(^o^)丿

Object.assign() はプロパティの値をコピーするため、深い複製を行うには別な方法を使用する必要があります。元の値がオブジェクトへの参照である場合、参照の値のみをコピーするからです。

引用: MDN Web docs | Object.assign() | 深い複製についての注意

再帰的にコピーする

というわけで、他の方法を探さないといけません。
とりあえず思考停止で自力でやるとこんな感じになりました。

const cloneObjct = obj => {
 let newObj = {};
 for (var key in obj ) {
  if (isObject(obj[key])) {
   newObj[key] = cloneObjct(obj[key]);
  } else {
   newObj[key] = obj[key];
  }
 }
 return newObj;
}

let newObject = cloneObject(deepObject);

lodashを使う

単にプリミティブ型をコピーしたい場合は自力でも良いと思いますが、
ArrayやStringなどのObjectTypeには個別に対応しないといけないようです。

やってられないので、ライブラリに頼ります。

npm install --save lodash
const newObj = _.cloneDeep(oldObj); 

OSSって素晴らしいですね (´Д`)