| この記事の要点 |
|---|
|
方法 1: スプレッド構文(推奨)
ES2018 以降で使える、もっとも読みやすい方法。新しいオブジェクトを返すので元のオブジェクトは変更されません。
const a = { name: "Alice", age: 30 };
const b = { age: 31, email: "alice@example.com" };
const merged = { ...a, ...b };
console.log(merged);
// → { name: "Alice", age: 31, email: "alice@example.com" }
// 後の方 (b の age) が優先される
// 3 つ以上
const c = { role: "admin" };
const all = { ...a, ...b, ...c };
// プロパティを追加・上書き
const updated = { ...a, age: 35, status: "active" };
// 元のオブジェクトを保持したまま部分更新(イミュータブル)
const user = { name: "Alice", profile: { age: 30 } };
const newUser = { ...user, name: "Bob" }; // user は変わらない
方法 2: Object.assign()
ES6 (ES2015) から。第 1 引数 (target) を変更するので注意。
const a = { name: "Alice", age: 30 };
const b = { age: 31, email: "alice@example.com" };
const merged = Object.assign(a, b);
console.log(a);
// → { name: "Alice", age: 31, email: "alice@example.com" }
// a が変更される!
// a を変更したくない場合は空オブジェクトを target に
const merged2 = Object.assign({}, a, b);
console.log(a); // → 変わらない
console.log(merged2); // → { name: "Alice", age: 31, email: "..." }
方法 3: lodash の merge / mergeWith(深いマージ)
ネストされたオブジェクトを再帰的にマージしたいとき:
const a = {
name: "Alice",
profile: { age: 30, hobbies: ["read"] }
};
const b = {
profile: { age: 31, location: "Tokyo" }
};
// スプレッドの場合(シャロー)
const shallow = { ...a, ...b };
console.log(shallow.profile);
// → { age: 31, location: "Tokyo" }
// hobbies が消える!b の profile が a の profile を完全に上書き
// lodash の merge
import _ from "lodash";
const deep = _.merge({}, a, b);
console.log(deep.profile);
// → { age: 31, hobbies: ["read"], location: "Tokyo" }
// ネストもマージされる
シャローコピー vs ディープコピー
スプレッド・Object.assign は1 階層だけのコピーです:
const a = { profile: { age: 30 } };
const b = { ...a };
b.profile.age = 99;
console.log(a.profile.age); // → 99
// a.profile と b.profile は同じオブジェクトを参照(シャローコピー)
// ディープコピーの方法
// 1. structuredClone (モダンブラウザ + Node 17+)
const deep = structuredClone(a);
// 2. JSON 経由(関数・Date 等は失われる)
const deep2 = JSON.parse(JSON.stringify(a));
// 3. lodash の cloneDeep
const deep3 = _.cloneDeep(a);
deep.profile.age = 99;
console.log(a.profile.age); // → 30 (変わらない)
条件付きマージ
// 条件で対象を変える
const base = { name: "Alice" };
const extra = condition ? { extra: "value" } : {};
const result = { ...base, ...extra };
// null / undefined はマージしても OK (空オブジェクト相当)
const merged = { ...base, ...null, ...undefined }; // base そのまま
// 条件で property を含める / 除外
const user = {
name: "Alice",
...(isAdmin && { role: "admin" }),
...(email && { email })
};
配列のマージ
オブジェクトとは別:
const a = [1, 2, 3];
const b = [4, 5, 6];
// スプレッド
const merged = [...a, ...b]; // → [1,2,3,4,5,6]
// concat
const merged2 = a.concat(b); // → [1,2,3,4,5,6]
// 重複排除
const unique = [...new Set([...a, ...b])];
// オブジェクトの配列を ID でマージ
const users1 = [{ id: 1, name: "A" }, { id: 2, name: "B" }];
const users2 = [{ id: 2, name: "B2" }, { id: 3, name: "C" }];
const merged3 = [...new Map(
[...users1, ...users2].map(u => [u.id, u])
).values()];
// → [{id:1,name:"A"}, {id:2,name:"B2"}, {id:3,name:"C"}]
注意点
| 方法 | シャロー / ディープ | 元を変更 | 備考 |
|---|---|---|---|
スプレッド {...a, ...b} | シャロー | × | 推奨 |
Object.assign(a, b) | シャロー | ○(a を変更) | 第 1 引数注意 |
Object.assign({}, a, b) | シャロー | × | スプレッドと同等 |
_.merge({}, a, b) | ディープ | × | lodash 依存 |
structuredClone(a) | ディープコピー | × | マージはしない、単純コピー |
JSON.parse(JSON.stringify(a)) | ディープ | × | 関数/Date/undefined 喪失 |
関連記事
子ページ
子ページはありません
同階層のページ
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38