みなさんこんにちは、現役エンジニアのサメハックです
未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。
JavaScriptの解説シリーズです。
今回はスプレッド構文とmap関数を使って配列を含むオブジェクトの更新について学んでいきましょう!
駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!
この記事を読むと・・・
- スプレッド構文がわかる
- map関数がわかる
- オブジェクトの部分更新ができる
今回の記事は難易度高めだよ!
スプレッド構文とmap関数を学ぼう!
スプレッド構文とは

...Object
上記のようにドットを3つ連ねて記述する構文で
配列やオブジェクトを自動的に展開してくれるショートハンドです。
user = {
...user,
name: "新しい名前"
}
のように使うともともと存在したuserオブジェクトのプロパティと値を流用した上で
nameプロパティの更新、あるいは追加をすることができます。

【JavaScript&TypeScript】スプレッド構文を使おう!【...Object】
今回のキモとなる構文だよ!
自信がない人はこちらの記事も参考に!
自信がない人はこちらの記事も参考に!
map関数とは

配列.map((変数) => 更新処理);
このように記述することで
配列の中身を1つずつ順番に取り出し、それぞれに更新処理を適用することが出来ます。

【JavaScript】map関数を使おう!【配列操作】
詳しく知りたい方はこちらの記事を参照してください。
今回は配列を持つプロパティの更新に使用するよ!
スプレッド構文とmap関数を使ってオブジェクトの部分更新をしよう!

これまでの技術を組み合わせてオブジェクトの部分更新処理を作ります。
let group = {
groupName: "グループ1",
members: [
{ name: "サメハック", age: 30, id: 0 },
{ name: "ねこハック", age: 31, id: 1 },
{ name: "いぬハック", age: 40, id: 2 },
{ name: "ぶたハック", age: 23, id: 3 },
],
};
このgroupに更新を加えます。
やることは
- groupNameを”グループ1_改”に更新
- membersすべてのageを”非公開”に更新
- membersにisLeaderプロパティを追加し、idが0のメンバーはtrueとする
let group = {
groupName: "グループ1",
members: [
{ name: "サメハック", age: 30, id: 0 },
{ name: "ねこハック", age: 31, id: 1 },
{ name: "いぬハック", age: 40, id: 2 },
{ name: "ぶたハック", age: 23, id: 3 },
],
};
group = {
// groupを展開
...group,
// groupNameプロパティの値を更新
groupName: "グループ1_改",
// membersプロパティを更新
// group.membersは配列なので、順番に中身を取り出して更新をかける
members: group.members.map((member) => ({
// memberを展開
...member,
age: "非公開",
// 新しいプロパティを追加し、値を設定
isLeader: member.id === 0 ? true : false,
})),
};
console.log("group", group);

このように、期待通りの結果を得ることができました。
ポイントとしてはmembersの更新箇所かと思いますが、
やっていることとしては単純で、
- map関数でmembersの中身を順番に取り出す
- memberを展開し、既存のプロパティと値を流用する
- ageには新しい値を設定
- isLeaderプロパティを追加※値は三項演算子を使って設定
この4つだけです。
いわゆる”高級”な記述方法が続くので、
パッと見たときに混乱してしまいそうですが、
1つ1つ紐解いて解読することが大切です。
オブジェクトの部分更新ができてえらい!
まとめ

- スプレッド構文:オブジェクトを展開し、既存のデータを流用する
- map関数:配列のデータを順番に取り出し、値を更新する
- 上記2つの組み合わせで配列を含むオブジェクトの部分更新が可能

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈