オブジェクトのサブセットを得る
オブジェクトのサブセットを得る方法です。サブセットとは、あるオブジェクトのいち部分を切り取ったもので、ここで紹介する方法は、プロパティ名を指定してオブジェクトの一部分を切り出すものです。たとえば、次のような数多くのプロパティを持つオブジェクトがあるとき、ここから数個のプロパティだけを持つオブジェクトを作る方法です。
typescript
const profile = {name: "suin",twitter: "suin",github: "suin",country: "JP",prefecture: "東京都",city: "千代田区",address: "丸の内2-4-1",buiding: "丸ビル",zipcode: "100-6390",};// 上の9つプロパティを持つオブジェクトから、下の6つのプロパティだけを抽出したオブジェクトを得たいconst address = {country: "JP",prefecture: "東京都",city: "千代田区",address: "丸の内2-4-1",buiding: "丸ビル",zipcode: "100-6390",};
typescript
const profile = {name: "suin",twitter: "suin",github: "suin",country: "JP",prefecture: "東京都",city: "千代田区",address: "丸の内2-4-1",buiding: "丸ビル",zipcode: "100-6390",};// 上の9つプロパティを持つオブジェクトから、下の6つのプロパティだけを抽出したオブジェクトを得たいconst address = {country: "JP",prefecture: "東京都",city: "千代田区",address: "丸の内2-4-1",buiding: "丸ビル",zipcode: "100-6390",};
#
方法1: 即時関数・分割代入・shorthand property nameの合わせ技オブジェクトのサブセットを得る1つ目の方法は、即時関数と分割代入、そして、shorthand property nameを組み合わせる方法です。
typescript
const sns = (({ twitter, github }) => ({ twitter, github }))(profile);//=> {// "twitter": "suin",// "github": "suin"// }
typescript
const sns = (({ twitter, github }) => ({ twitter, github }))(profile);//=> {// "twitter": "suin",// "github": "suin"// }
この方法のメリットとデメリットは次のとおりです。
- メリット
- 外部ライブラリを必要としない。
- デメリット
- 初見の読み手には意外性のあるコードに見える場合がある。
- 即時関数の引数部分とshorthand property nameの2箇所に同じプロパティ名を書く必要があり冗長。
この書き方は、数個の少ないプロパティを抽出したいときは便利ですが、たくさんのプロパティを抽出しようとすると記述量が増え、徐々に大変さが出てきます。
抽出したいプロパティよりも、除きたいプロパティのほうが少ない場合は、次のような書き方で除きたいプロパティを指定するほうが簡単です。
typescript
const address = (({ name, twitter, github, ...rest }) => rest)(profile);//=> {// "country": "JP",// "prefecture": "東京都",// "city": "千代田区",// "address": "丸の内2-4-1",// "buiding": "丸ビル",// "zipcode": "100-6390"// }
typescript
const address = (({ name, twitter, github, ...rest }) => rest)(profile);//=> {// "country": "JP",// "prefecture": "東京都",// "city": "千代田区",// "address": "丸の内2-4-1",// "buiding": "丸ビル",// "zipcode": "100-6390"// }
JavaScriptでは、delete
を使うとオブジェクトからプロパティを取り除けるので、上の書き方はまどろっこしいと思われるかもしれません。この書き方をするには理由があって、TypeScriptではdelete
の使い勝手が良くないからです。たとえば、profile
オブジェクトからname
プロパティをdelete
するコードを書いただけでは、「Property 'name' does not exist on type ...」といったコンパイルエラーが発生してしまうのです。
typescript
const address = { ...profile };delete address.name;// ERROR: Property 'name' does not exist on type '{ country: string; prefecture: string; city: string; address: string; buiding: string; zipcode: string; }'.(2339)
typescript
const address = { ...profile };delete address.name;// ERROR: Property 'name' does not exist on type '{ country: string; prefecture: string; city: string; address: string; buiding: string; zipcode: string; }'.(2339)
#
方法2: lodash.pick / lodash.omit2つ目の方法はlodashを用いるものです。lodashはさまざまな便利関数を提供するライブラリで、その中のひとつにpick
というオブジェクトのサブセットを得るための関数があります。
typescript
import _ from "lodash";const sns = _.pick(profile, ["twitter", "github"]);//=> {// "twitter": "suin",// "github": "suin"// }
typescript
import _ from "lodash";const sns = _.pick(profile, ["twitter", "github"]);//=> {// "twitter": "suin",// "github": "suin"// }
lodash全体ではなく、pick
関数だけが必要な場合は、パッケージlodash.pickを使うこともできます。この場合、次のようにしてpick
関数を使います。
typescript
import pick from "lodash.pick";const sns = pick(profile, ["twitter", "github"]);
typescript
import pick from "lodash.pick";const sns = pick(profile, ["twitter", "github"]);
lodash.pickのメリットとデメリットは次のとおりです。
- メリット
- 宣言的で読みやすい。
- 記述量が少ない。
- デメリット
- ライブラリを導入する必要がある。
lodash.pickは抽出したいプロパティ名を指定する関数ですが、抽出したいプロパティより除外したいプロパティが少ない場合は、lodash.omitを使ったほうが便利です。
typescript
import _ from "lodash";const address = _.omit(profile, ["name", "twitter", "github"]);//=> {// "country": "JP",// "prefecture": "東京都",// "city": "千代田区",// "address": "丸の内2-4-1",// "buiding": "丸ビル",// "zipcode": "100-6390"// }
typescript
import _ from "lodash";const address = _.omit(profile, ["name", "twitter", "github"]);//=> {// "country": "JP",// "prefecture": "東京都",// "city": "千代田区",// "address": "丸の内2-4-1",// "buiding": "丸ビル",// "zipcode": "100-6390"// }
lodash、lodash.pickとlodash.omitのインストールは次のコマンドで行なえます。
bash
# lodashのインストールnpm install lodashnpm install -D @types/lodash# lodash.pickとlodash.omitのインストールnpm install lodash.pick lodash.omitnpm install -D @types/lodash.pick @types/lodash.omit
bash
# lodashのインストールnpm install lodashnpm install -D @types/lodash# lodash.pickとlodash.omitのインストールnpm install lodash.pick lodash.omitnpm install -D @types/lodash.pick @types/lodash.omit