JavaScriptでオブジェクトをディープコピー(深いコピー)する方法
オブジェクトのディープコピー(深いコピー)とは、コピー対象のオブジェクト内に含まれるネストされたすべてのオブジェクトまで完全に複製することです。コピーと元のオブジェクトは一切の参照を共有しないため、片方を変更してももう片方には一切影響しません。
最も手軽な方法は、オブジェクトをJSON文字列に変換してから、再びJavaScriptオブジェクトへ戻すというものです。ただし、この方法ではメソッド(関数)や undefined、Symbol などはコピーできない点に注意が必要です。
サンプルコード
let obj = {
foo: 1,
bar: { baz: 'test' }
}
let newObj = JSON.parse(JSON.stringify(obj));
obj.bar.baz = 20;
console.log(obj);
console.log(newObj);実行結果
{ foo: 1, bar: { baz: 20 } }
{ foo: 1, bar: { baz: 'test' } }この例では、元の obj の bar.baz を変更しても newObj は影響を受けていません。つまり、ネストされたオブジェクトも含めて独立した複製が作られ、ディープコピーが正しく行えたことが確認できます。
JSON方式の注意点
- DateオブジェクトはISO形式の文字列に変換されてしまう
- 関数・undefined・Symbolはプロパティごと消えてしまう
- 循環参照を含むオブジェクトではエラーが発生する
モダンな代替手段:structuredClone() を使う
最近のブラウザやNode.js(v17以降)では、グローバル関数 structuredClone() を利用できます。こちらは Date、Map、Set などの組み込みオブジェクトもそのまま保持したまま安全にディープコピーできるため、現在では推奨される方法です。
const newObj = structuredClone(obj);
用途に応じて、シンプルなデータならJSON方式、より厳密なコピーが必要なら structuredClone() を選ぶとよいでしょう。
-
JavaScriptでインポートしたオブジェクトを分割代入(デストラクチャリング)する方法
JavaScriptでは、ESモジュールからインポートしたオブジェクトに対して分割代入(デストラクチャリング)を使うことで、必要なプロパティだけを個別の変数として簡潔に取り出すことができます。ここでは、import で読み込んだオブジェクトを分割代入する具体的な手順とコード例を紹介します。 ポイント:分割代入の基本構文 オブジェクトの分割代入は、次のように波括弧 { } の中に取り出したいプロパティ名を並べて記述します。let {プロパティ1, プロパティ2, プロパティ3} = オブジェクト;この構文は、インポートされたデフォルトエクスポートのオブジェクトにもそのまま適用できます。 コード例
-
JavaScriptで多次元オブジェクトを作成する方法【サンプルコード付き】
はじめに JavaScriptでは、オブジェクトのプロパティの値として別のオブジェクトを持たせることで、多次元(ネストされた)オブジェクトを作成できます。この構造を活用すると、氏名や学校情報、住所のように階層関係のあるデータを、直感的かつ整理された形で表現することが可能です。 サンプルコード 以下は、多次元JavaScriptオブジェクトを作成し、コンソールに表示するためのコード例です。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /