JavaScriptでオブジェクトを浅くコピー(シャローコピー)する方法をわかりやすく解説
JavaScriptでオブジェクトを浅いコピー(シャローコピー)したい場合、ライブラリUnderscore.jsが提供する_.extend()メソッドを利用できます。このメソッドは、1つ以上のソースオブジェクトが持つすべてのプロパティを宛先(destination)オブジェクトへコピーし、その宛先オブジェクトを返します。
ここで重要なのは、コピーが参照(reference)ベースで行われるという点です。つまり、ネストされたオブジェクトや配列の中身そのものは複製されず、元データへの参照が引き継がれます。これこそが「浅いコピー」と呼ばれる所以です。
構文
_.extend(object*);
_.extend()は複数のオブジェクトを引数として受け取ることができ、その数に制限はありません。最初のオブジェクトが宛先となり、以降のオブジェクトのプロパティが順番にマージされていきます。
例1:3つのオブジェクトをマージする
次の例では、3つの独立したオブジェクトを浅いコピーによって1つに統合し、結果を出力しています。
<html>
<body>
<script
src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.10.0/lodash.min.js"></script>
</head>
<body>
<script>
var res = JSON.stringify(_.extend(
{name: 'Ram', designation: "content developer"},
{age: 50},
{salary: 1200000}));
document.write((res));
</script>
</body>
</html>出力結果
{"name":"Ram","designation":"content developer","age":50,"salary":1200000}各オブジェクトが持っていたプロパティ(name、designation、age、salary)がすべて1つのオブジェクトに統合されているのが確認できます。
例2:別の組み合わせでマージする
<html>
<body>
<script
src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.10.0/lodash.min.js"></script>
</head>
<body>
<script>
var res = JSON.stringify(_.extend(
{name: 'Ram', designation: "content developer"},
{age: 50,salary: 1200000},
{country: "India"}));
document.write((res));
</script>
</body>
</html>出力結果
{"name":"Ram","designation":"content developer","age":50,"salary":1200000,"country":"India"}補足:モダンな代替手段
現在のJavaScriptでは、ライブラリに頼らなくても、標準のObject.assign()メソッドやスプレッド構文を使って同じように浅いコピーを実現できます。
const merged = Object.assign({}, obj1, obj2);
// または
const merged = {...obj1, ...obj2};ただし、これらも同様に「浅いコピー」である点には注意が必要です。ネストされたオブジェクトまで完全に複製したい場合は、structuredClone()など深いコピー(ディープコピー)向けの手法を検討しましょう。
-
JavaScriptで2つのオブジェクトをマージする方法を解説
JavaScriptでは、スプレッド構文(...)を使うことで、2つのオブジェクトを簡単に1つにマージ(結合)できます。各オブジェクトの前に「...」を付けて新しいオブジェクトリテラル内に展開するだけで、すべてのプロパティが統合されたオブジェクトが生成されます。以下に、2つのJavaScriptオブジェクトをマージするコードの例を示します。コード例<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=dev
-
JavaScriptでオブジェクトにreduceメソッドを適用する方法
JavaScriptのreduce()メソッドは本来配列向けのメソッドのため、オブジェクトにそのまま適用することはできません。そこで、Object.values()メソッドを使ってオブジェクトの値を配列として取り出し、その配列に対してreduce()を適用します。 以下は、JavaScriptでオブジェクトの値にreduceメソッドを適用するコード例です。 コード例 <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8 /> <meta name=viewport content