オブジェクト分割は、オブジェクトからプロパティを抽出し、変数にバインドするための便利なJavaScript機能です。
何より良いのは、オブジェクトの分割は、一つのステートメントで複数のプロパティを抽出することができ、ネストされたオブジェクトからプロパテ
この記事では、JavaScriptでオブジェクトの破壊を使用する方法を説明します。
1. オブジェクトの破壊の必要性
オブジェクトのいくつかのプロパティを抽出したいとします。 ES2015より前の環境では、次のコードを記述する必要があります:
var hero = { name: 'Batman', realName: 'Bruce Wayne'};var name = hero.name;var realName = hero.realName;name; // => 'Batman',realName; // => 'Bruce Wayne'
プロパティhero.name
の値は、変数name
に割り当てられます。 同じ方法でhero.realName
値がrealName
に割り当てられます。
プロパティにアクセスして変数に割り当てるには、定型コードが必要です。 var name = hero.name
と書くことで、name
バインディングを2回言及し、realName
についても同じことを言及する必要があります。
これは、オブジェクト分割構文が便利な場所です:プロパティ名を複製せずにプロパティを読み取り、その値を変数に割り当てることができます。 それ以上に、1つのステートメントで同じオブジェクトから複数のプロパティを読み取ることができます!
上記のスクリプトをリファクタリングし、オブジェクトの破壊を適用してプロパティname
にアクセスし、realName
:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
はオブジェクトの分割割り当てです。 このステートメントは、変数name
およびrealName
を定義し、それに対応するプロパティhero.name
およびhero.realName
の値を割り当てます。
オブジェクトのプロパティにアクセスするための2つのアプローチの比較:
const name = hero.name;const realName = hero.realName;// is equivalent to:const { name, realName } = hero;
プロパティ名もオブジェクト変数も重複していないため、オブジェクトの分割がより便利であることがわかります。
2. プロパティの抽出
オブジェクトの破壊の基本的な構文は非常に簡単です:
const { identifier } = expression;
ここで、identifier
はアクセスするプロパティの名前で、expression
はオブジェクトに評価する必要があります。 破壊の後、変数identifier
にはプロパティ値が含まれます。
プロパティアクセサを使用した同等のコードは次のとおりです:
const identifier = expression.identifier;
実際にオブジェクトの破壊を試してみましょう:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name } = hero;name; // => 'Batman'
ステートメントconst { name } = hero
は変数name
を定義し、hero.name
プロパティの値で初期化します。
3. 複数のプロパティの抽出
オブジェクトを複数のプロパティに分割するには、間にカンマ,
を追加して、好きなだけプロパティを列挙します:
const { identifier1, identifier2, ..., identifierN } = expression;
ここで、identifier1
、…、identifierN
はアクセスするプロパティの名前であり、expression
はオブジェクトに評価する必要があります。 破壊後、変数identifier1
、…、identifierN
には対応するプロパティ値が含まれます。
これは同等のコードです:
const identifier1 = expression.identifier1;const identifier2 = expression.identifier2;// ...const identifierN = expression.identifierN;
2つのプロパティが抽出されている最初のセクションの例をもう一度見てみましょう:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, realName } = hero;name; // => 'Batman',realName; // => 'Bruce Wayne'
const { name, realName } = hero
対応するプロパティhero.name
およびhero.realName
の値を割り当てた2つの変数name
およびrealName
を作成します。
4. デフォルト値
破壊されたオブジェクトに破壊の割り当てで指定されたプロパティがない場合、変数にはundefined
が割り当てられます。 それがどのように起こるか見てみましょう:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies } = hero;enemies; // => undefined
プロパティenemies
がオブジェクトhero
に存在しないため、変数enemies
はundefined
になります。
幸いなことに、プロパティが破壊されたオブジェクトに存在しない場合は、デフォルト値を設定することができます。 基本的な構文は次のとおりです:
const { identifier = defaultValue } = expression;
ここで、identifier
はアクセスするプロパティの名前で、expression
はオブジェクトに評価する必要があります。 破壊後、変数identifier
にはプロパティ値が含まれているか、identifier
プロパティが存在しない場合はdefaultValue
が割り当てられます。
これは同等のコードです:
const identifier = expression.identifier === undefined ? defaultValue : expression.identifier;
前のコードサンプルを変更して、既定値機能を使用しましょう:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { enemies = } = hero;enemies; // =>
ここで、undefined
ではなく、変数enemies
のデフォルトはになります。
5. エイリアス
プロパティとは異なる名前の変数を作成したい場合は、オブジェクトの分割のエイリアス機能を使用できます。
const { identifier: aliasIdentifier } = expression;
identifier
アクセスするプロパティの名前を指定し、aliasIdentifier
は変数名を指定し、expression
はオブジェクトに評価する必要があります。 破壊の後、変数aliasIdentifier
にはプロパティ値が含まれます。
同等のコード:
const aliasIdentifier = expression.identifier;
オブジェクトの分割エイリアス機能の例を次に示します:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { realName: secretName } = hero;secretName; // => 'Bruce Wayne'
const { realName: secretName } = hero
を見ると、destucturingは新しい変数secretName
(別名変数)を定義し、それに値hero.realName
を割り当てます。
6. ネストされたオブジェクトからのプロパティの抽出
前の例では、オブジェクトはプレーンでした。
多くの場合、オブジェクトは他のオブジェクトにネストできます。 つまり、一部のプロパティにはオブジェクトを含めることができます。
このような場合でも、オブジェクトの破壊とdeepからのアクセスプロパティを使用できます。 基本的な構文は次のとおりです:
const { nestedObjectProp: { identifier } } = expression;
nestedObjectProp
入れ子になったオブジェクトを保持するプロパティの名前を指定します。 identifier
は、ネストされたオブジェクトからアクセスするプロパティ名です。 expression
は、破壊されたオブジェクトに評価されます。
分割後、変数identifier
にはネストされたオブジェクトのプロパティ値が含まれます。
上記の構文は次のようになります:
const identifier = expression.nestedObjectProp.identifier;
プロパティを抽出できる入れ子のレベルは無制限です。 Deepからプロパティを抽出する場合は、入れ子になった中括弧を追加するだけです:
const { propA: { propB: { propC: { .... } } } } = object;
たとえば、オブジェクトhero
には、ネストされたオブジェクト{ city: 'Gotham'}
が含まれています。
const hero = { name: 'Batman', realName: 'Bruce Wayne', address: { city: 'Gotham' }};// Object destructuring:const { address: { city } } = hero;city; // => 'Gotham'
オブジェクトの破壊const { address: { city } } = hero
ネストされたオブジェクトからプロパティcity
にアクセスしましょう。
7. 動的な名前のプロパティを抽出する
動的な名前を持つ変数プロパティを抽出できます(プロパティ名は実行時に認識されています):
const { : identifier } = expression;
propName
expressionはプロパティ名(通常は文字列)に評価され、identifier
は破壊後に作成された変数名を示す必要があります。 2番目のexpression
は、破壊したいオブジェクトに評価する必要があります。
オブジェクトの破壊を行わない同等のコード:
const identifier = expression;
prop
がプロパティ名を保持している例を見てみましょう:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const prop = 'name';const { : name } = hero;name; // => 'Batman'
const { : name } = hero
変数name
に値hero
を代入するオブジェクトの破壊です。prop
はプロパティ名を保持する変数です。
8. Destructuring後のRestオブジェクト
rest構文は、destructuring後の残りのプロパティを収集するのに便利です:
const { identifier, ...rest } = expression;
ここで、identifier
はアクセスするプロパティの名前で、expression
はオブジェクトに評価する必要があります。
破壊後、変数identifier
にはプロパティ値が含まれます。 rest
変数は、残りのプロパティを持つプレーンなオブジェクトです。
たとえば、プロパティname
を抽出しますが、残りのプロパティは保持します:
const hero = { name: 'Batman', realName: 'Bruce Wayne'};const { name, ...realHero } = hero;realHero; // => { realName: 'Bruce Wayne' }
destructuringconst { name, ...realHero } = hero
は、プロパティname
を抽出します。
同時に、残りのプロパティ(この場合はrealName
)は変数realHero
:{ realName: 'Bruce Wayne' }
に収集されます。
9. 一般的な使用例
9.1プロパティを変数にバインドする
前の多くの例に見られるように、オブジェクト分割はプロパティ値を変数にバインドします。
オブジェクトの破壊は、const
、let
、var
を使用して宣言された変数に値を割り当てることができます。 または、既存の変数に代入することさえできます。
たとえば、let
ステートメントを使用して破壊する方法は次のとおりです:
// letconst hero = { name: 'Batman',};let { name } = hero;name; // => 'Batman'
var
ステートメントを使用して破棄する方法:
// varconst hero = { name: 'Batman',};var { name } = hero;name; // => 'Batman'
そして、すでに宣言された変数に破壊する方法は:
// existing variablelet name;const hero = { name: 'Batman',};({ name } = hero);name; // => 'Batman'
私はそれがすぐにプロパティを抽出するために、オブジェクトの破壊とfor..of
サイクルを組み合わせることが満足していることがわかります:
const heroes = ;for (const { name } of heroes) { console.log(name); // logs 'Batman', 'Joker'}
9.2 Function parameter destructuring
一般に、オブジェクトのdestructuringは、代入が行われる場所のどこにでも置くことができます。
たとえば、関数のparametersリスト内のオブジェクトを破棄することができます:
const heroes = ;const names = heroes.map( function({ name }) { return name; });names; // =>
function({ name })
関数パラメータを破壊し、name
プロパティの値を保持する変数name
を作成します。
10. 概要
オブジェクトの分割は、オブジェクトからプロパティを抽出し、これらの値を変数にバインドできる強力な機能です。
私は特にオブジェクトの破壊について好きです簡潔な構文と一つの文で複数の変数を抽出する機能です。
うまくいけば、私の投稿はあなたがオブジェクトの破壊がいかに有用であるかを見るのを助けました!