JavaScript デストラクタ

Migel Hewage Nimesha 2023年10月12日
  1. オブジェクトで破壊を使用する
  2. 配列で破壊を使用する
  3. 配列とオブジェクトで同時に構造化を使用する
  4. まとめ
JavaScript デストラクタ

この記事では主に、ES6 の最も便利な機能の 1つである JavaScript の構造化解除に焦点を当てます。 構造化解除は、配列項目またはオブジェクト プロパティを個別の変数、配列、オブジェクト、ネストされたオブジェクト、およびデータのすべての抽出を可能にする変数への割り当てにアンパックできるようにする JavaScript ステートメントです。

同時に、いくつかの例を見て、配列、オブジェクト、およびその両方に対して構造化解除を使用する方法を確認します。

オブジェクトで破壊を使用する

// object
const employee = {
  id: 001,
  name: 'John Oliver',
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

前述の JS コードの employee オブジェクトが表示されます。 右側では、この従業員には、idnameage、および department などの基本的なプロパティがあります。 いくつかのデータを含むコンソールが表示されます。

// object
const employee = {
  id: 001,
  name: 'John Oliver',
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

const name = employee.name;
const age = employee.age;

console.log(name);
console.log(age);

そのため、まず、オブジェクトの構造化解除をどのように使用できるかを見ていきます。

この従業員のプロパティにアクセスしたい場合、どうすればよいでしょうか? 名前を書くことができます。 employee.name を変更します。

年齢にアクセスする場合は、employee.age に変更します。

console.log(name); を使用して名前と年齢をコンソールに出力するとします。 そして console.log(age);. コードを実行すると、nameage がコンソール出力されていることがわかります。

コンソール出力

ここでは、同じことを繰り返し行っていることがわかります。 name を 2 回、age を 2 回、従業員を繰り返しました。

しかし、ES6 は、小さな構文で簡潔に実行できるため、繰り返す必要がない場合に、割り当てを構造化解除するためのいくつかの最高の機能を提供します。

このタスクを非構造化でどのように達成できるかを見てみましょう。 まず、変数を書きます。

ここで、この定数は employee と同じです。

// object
const employee = {
  id: 001,
  name: 'John Oliver',
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

//const name = employee.name;
//const age = employee.age;

const { name, age } = employee;

console.log(name);
console.log(age);

しかし左側では、オブジェクト構文を作成し、employee オブジェクトからアクセスしたいプロパティ名を記述できます。 そのため、nameage にもアクセスしたいと考えています。

上記のコードを実行すると、同じ出力または結果が返されます。

定数出力

ここでは、employee.nameemployee.age を繰り返していません。 これらのプロパティ名を直接使用しているだけです。

name をプロパティとして使用せず、他の名前を付けたい場合は、もう 1つ実行できます。

// object
const employee = {
  id: 001,
  name: 'John Oliver',
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

//const name = employee.name;
//const age = employee.age;

const { name: fullName, age } = employee;

console.log(fullName);
console.log(age);

次に、コロンを記述して fullName を使用できますが、それでも同じ結果が得られます。 この構造化解除の素晴らしい点の 1つは、ここでデフォルトのパラメーターを使用できることです。

// object
const employee = {
  id: 001,
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

// const name = employee.name;
// const age = employee.age;

const {name: fullName = 'Lora Noah ', age} = employee;

console.log(fullName);
console.log(age);

Lora Noah のデフォルト パラメータを使用するとします。 デフォルトのパラメータを使用したことがわかります。

プロパティ名を含まないこの employee オブジェクトを見てみましょう。 その場合、デフォルト値の Lora Noah が使用されます。

パラメータ出力

employee のようなネストされたオブジェクトを分解したいとします。 特定の従業員が住んでいる都市を知り、現在知っている住所に追加する必要があります。

それなら、それもできます。 まず住所が必要です。

このアドレスをコンソールにすると、オブジェクトが得られます。 コードを実行してみましょう。

// object
const employee = {
  id: 001,
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

// const name = employee.name;
// const age = employee.age;

const {address} = employee;

console.log(address);

出力は、次のように受信されます。 しかし、私たちはその都市だけを望んでいます。

アドレス出力

オブジェクトは変更できるので、完全なオブジェクトは必要ありません。 何を分解できるか? 都市について書くことができます。

アドレスを削除し、コンソールに city を使用します。

// object
const employee = {
  id: 001,
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

// const name = employee.name;
// const age = employee.age;

const {address: {city}} = employee;

console.log(city);

得られる出力は次のとおりです。

都市出力

次に、関数で構造化解除を使用できる場合、出力として Colombo を取得します。 構築する関数は、displayEmployee と呼ばれる必要があります。

この関数は employee を受け取り、console.log() を必要とします。 コンソールには文字列リテラルを使用します。

従業員名を ${name} と書き、年齢を ${age}; とします。 コンソール用。

// object
const employee = {
  id: 001,
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

function displayEmployee(employee) {
  console.log(`The employee name is ${name} and age is ${age}`);
}

displayEmployee(employee);

それらの名前を印刷したい場合、通常はどうすればよいでしょうか? コンソールの employee.nameemployee.age

// object
const employee = {
  id: 001,
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

function displayEmployee(employee) {
  console.log(
      `The employee name is ${employee.name} and age is ${employee.age}`);
}

displayEmployee(employee);

このコード実行では、employee.name が未定義として取得されていることがわかります。

社員出力

そのため、employee のオブジェクトから name プロパティを削除しました。 これで、John という名前と24という年齢を取得できます。

コードと、コードを実行した後の予想される出力を以下に示します。

// object
const employee = {
  id: 001,
  name: 'John',
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

function displayEmployee(employee) {
  console.log(
      `The employee name is ${employee.name} and age is ${employee.age}`);
}

displayEmployee(employee);

出力:

出力名

しかし、関数の構造を分解することもできます。 したがって、この機能を分解するには年齢が必要です。 名前が必要です。

ここでシーケンスを維持する必要はありません。 言い換えれば、≪名前≫と≪年齢≫が書ける。

決まった順番はありませんので、必要に応じて変更可能です。

// object
const employee = {
  id: 001,
  name: 'John',
  age: 24,
  department: 'Marketing',
  address: {
    city: 'Colombo',
    country: 'Sri Lanka',
  },
};

function displayEmployee(age, name) {
  console.log(
      `The employee name is ${employee.name} and age is ${employee.age}`);
}

displayEmployee(employee);

このコードを実行すると、同じ出力が得られます。

関数出力

配列で破壊を使用する

配列を作成する必要があります。 配列の任意の値にアクセスしたいと考えています。

applemangobananapineapple という単語が配列に書き込まれています。 その配列を表すために、変数 fruit を使用します。

最初の要素 apple はインデックス 0 に書き込まれ、2 番目の要素 mango はインデックス 1 で使用されます。

そして、console.log(apple)console.log(mango) を表示します。

// Array
const fruits = ['apple', 'mango', 'banana', 'pineapple'];

const apple = fruits[0];
const mango = fruits[1];

console.log(apple);
console.log(mango);

出力を以下に示します。

配列出力の作成

その結果、applemango が得られます。 しかし、配列を分解したい場合は、それを書き込みます。

配列を分解するために、この定数は果物配列と同様に設定されます。

ここでは、配列が必要であり、値は配列に使用されます。 fruit1fruit2 を入力すると、最初のインデックスの apple が出力されます。

// Array
const fruits = ['apple', 'mango', 'banana', 'pineapple'];

// const apple = fruits[0];
// const mango = fruits[1];

const [fruit1, fruit2] = fruits;

console.log(fruit1);
console.log(fruit2);

したがって、apple には fruit1 の値が割り当てられ、mango には fruit2 の値が割り当てられます。 上記のfruit1という用語は、配列の最初の値に関連しています。

配列の 2 番目の値は fruit2 と呼ばれます。 これは配列の 2 番目の値 mango です。

配列出力

マンゴーをスキップしたい場合は、3 番目の値であるバナナが必要です。 したがって、空を実行します。

参照がない場合は、配列の 2 番目の値をスキップします。 これにより、3 番目の値が得られます。

// Array
const fruits = ['apple', 'mango', 'banana', 'pineapple'];

// const apple = fruits[0];
// const mango = fruits[1];

const [fruit1, , fruit2] = fruits;

console.log(fruit1);
console.log(fruit2);

次に、出力として applebanana を取得できます。

バナナ出力

配列の構造化に Rest 演算子を使用する

構造化解除に rest 演算子を使用することもできます。 配列の最初の 3つの項目と残りの値が必要な場合は、rest 演算子を使用できます。

rest 演算子を入力して console.log() を実行すると、pineapple を含む残りの配列を取得できます。

コードでは、オペレーターの動作を確認できます。

// Array
const fruits = ['apple', 'mango', 'banana', 'pineapple'];

// const apple = fruits[0];
// const mango = fruits[1];

const [fruit1, , fruit2, ...rest] = fruits;

console.log(fruit1);
console.log(fruit2);
console.log(rest);

これが出力です。

残りの出力

配列の構造化解除部分を行う方法は次のとおりです。

配列とオブジェクトで同時に構造化を使用する

まず、配列とオブジェクトを記述できます。 この食料品の配列は、以下のコードで確認できます。

// Array and Object
const groceryList = [
  {item: 'Apples', price: 25, category: 'fruits'},
  {item: 'Mangoes', price: 35, category: 'fruits'},
  {item: 'Tomatoes', price: 15, category: 'vege'},
  {item: 'Milk', price: 20, category: 'misc'},
  {item: 'Bread', price: 12, category: 'misc'},
  {item: 'Eggs', price: 18, category: 'misc'},
];


console.log(groceryList[0].item);

Apples にアクセスしたい場合、通常は console.log(groceryList[0].item); を実行します。 次に、Apples が出力として表示されます。

食料品の出力

分解を使用して、これを記述できます。 定数を書き、その中に りんご と書きます。

これらの ApplesgroceryList と同じになります。 まず、配列の最初の要素を調べたい場合は、配列があります。

// Array and Object
const groceryList = [
  {item: 'Apples', price: 25, category: 'fruits'},
  {item: 'Mangoes', price: 35, category: 'fruits'},
  {item: 'Tomatoes', price: 15, category: 'vege'},
  {item: 'Milk', price: 20, category: 'misc'},
  {item: 'Bread', price: 12, category: 'misc'},
  {item: 'Eggs', price: 18, category: 'misc'},
];

// console.log(groceryList[0].item);
const [apple] = groceryList;
console.log(apple);

これが出力です。

リンゴ出力

ここで配列は完成しましたが、オブジェクトは必要ありません。 構造化解除のためにオブジェクト内のアイテムのみが必要です。

オブジェクトを分解すると、常にプロパティと共に取得されます。 そして、リンゴのような性質はありません。

したがって、この方法でプロパティを割り当てる必要があります。 以下のコードを見てください。

変数のさまざまなコンポーネントをリンゴとして試すことができます。 しかし、アイテムとして直接使用する場合は、それを書くことができます。

// Array and Object
const groceryList = [
  {item: 'Apples', price: 25, category: 'fruits'},
  {item: 'Mangoes', price: 35, category: 'fruits'},
  {item: 'Tomatoes', price: 15, category: 'vege'},
  {item: 'Milk', price: 20, category: 'misc'},
  {item: 'Bread', price: 12, category: 'misc'},
  {item: 'Eggs', price: 18, category: 'misc'},
];

// console.log(groceryList[0].item);
const [{item}] = groceryList;
console.log(item);

出力には Apples と表示されます。

アイテム出力

出力をトマトにしたい場合は、最初の 2つのステップをスキップしてください。その後は何も心配する必要はありません。 Tomatoes が 3 番目の配列に表示されます。

// Array and Object
const groceryList = [
  {item: 'Apples', price: 25, category: 'fruits'},
  {item: 'Mangoes', price: 35, category: 'fruits'},
  {item: 'Tomatoes', price: 15, category: 'vege'},
  {item: 'Milk', price: 20, category: 'misc'},
  {item: 'Bread', price: 12, category: 'misc'},
  {item: 'Eggs', price: 18, category: 'misc'},
];

// console.log(groceryList[0].item);
const [, , {item}] = groceryList;
console.log(item);

これは、上記で実装されたコード チャンクの出力です。

トマト出力

Tomatoes を受け取った後、他のアイテムも必要だとします。 そのためには、同じ残りの演算子を適用し、コンソールに console.log() を追加する必要があります。

それができたら、オブジェクトの残りの配列を取得できます。

// Array and Object
const groceryList = [
  {item: 'Apples', price: 25, category: 'fruits'},
  {item: 'Mangoes', price: 35, category: 'fruits'},
  {item: 'Tomatoes', price: 15, category: 'vege'},
  {item: 'Milk', price: 20, category: 'misc'},
  {item: 'Bread', price: 12, category: 'misc'},
  {item: 'Eggs', price: 18, category: 'misc'},
];

// console.log(groceryList[0].item);
const [, , {item}, ...rest] = groceryList;
console.log(item);
console.log(rest);

出力を以下に示します。

to-rest 出力

それが、脱構造化がどれほど強力かということです。 オブジェクトに配列が含まれる別のアプローチの図を見てみましょう。

Singapore という場所を選択します。 したがって、シンガポールの場所を取得するには、console.log(company.(locations[0])) を実行できます。

// Array and Object
const company = {
  name: 'Google',
  locations: ['Singapore', 'India', 'Germany'],
};

console.log(company.locations[0]);

シンガポールとしての価値/アウトプットを得ることができます。 以下を参照してください。

会社出力

これは、構造化解除を使用して実現したいと考えています。 会社であるオブジェクトに等しい定数を書くことができます。

オブジェクトの構造化解除を行うには、中括弧を使用します。 中括弧では、プロパティ名を場所として使用します。

位置から、インデックス 0 の最初の値にアクセスする必要があります。したがって、ここに配列を書き込み、位置に loc を使用できます。

// Array and Object
const company = {
  name: 'Google',
  locations: ['Singapore', 'India', 'Germany'],
};

const {
  locations: [loc],
} = company;
console.log(loc);

そして、この loc を出力したいと思います。 したがって、console.log(loc) を使用します。 次に、出力として Singapore を取得できます。

loc 出力

India という結果が必要だとします。 したがって、最初の値をスキップします。 次に、その値を出力できます (インド)。

// Array and Object
const company = {
  name: 'Google',
  locations: ['Singapore', 'India', 'Germany'],
};

const {
  locations: [, loc],
} = company;
console.log(loc);

ここで、出力を確認できます。

インド出力

構造化解除について説明する最後の使用例があります。 ここでは、新しい Users として定数を使用します。

const Users = [
  ['John', 'Oliver'],
  ['James', 'Smith'],
  ['Mary', 'Elizabeth'],
];
[{
  firstName: 'John',
  lastName: 'Oliver',
},
 {
   firstName: 'James',
   lastName: 'Smith',
 },
 {
   firstName: 'Mary',
   lastName: 'Elizabeth',
 },
];

これらの Users にはネスト配列があります。 結果を以下の出力にしたい場合は、オブジェクトを含むオブジェクトとオブジェクトの内部を確認できます。

キーと値のペアが必要です: firstName は John で、lastName は Oliver です。 分解を使用すると、非常に簡単に実行できます。

ここでは、マップである高次配列関数を使用します。 そこで、Users を受け取る Users オブジェクトで定数を作成します。

最初のユーザーが表示されます。 最初のユーザーでは、必要なオブジェクトを返すことができます。 ここでは、firstName を行います。

この firstName はユーザー インデックス 0 に等しくなり、lastName のユーザー インデックスは 1 になります。

そのコンソールの後、console.log(UsersObj); を使用して Users オブジェクト。

const Users = [
  ['John', 'Oliver'],
  ['James', 'Smith'],
  ['Mary', 'Elizabeth'],
];
[{
  firstName: 'John',
  lastName: 'Oliver',
},
 {
   firstName: 'James',
   lastName: 'Smith',
 },
 {
   firstName: 'Mary',
   lastName: 'Elizabeth',
 },
];
const UserObj = Users.map((User) => {
    return { firstName: User[0], lastName: User[1] };
});

console.log(UserObj);

ここでは、3つのオブジェクトの firstNamelastName を取得します。

ユーザー出力

構造化解除に関して、ここで何ができるでしょうか? 配列から、最初の値を firstName として、2 番目の値を lastName として割り当てることができます。

const Users = [
  ['John', 'Oliver'],
  ['James', 'Smith'],
  ['Mary', 'Elizabeth'],
];
[{
  firstName: 'John',
  lastName: 'Oliver',
},
 {
   firstName: 'James',
   lastName: 'Smith',
 },
 {
   firstName: 'Mary',
   lastName: 'Elizabeth',
 },
];
const UserObj = Users.map(([firstName, lastName]) => {
    return { firstName: firstName, lastName: lastName };
});

console.log(UserObj);

ここでも、上記の出力と同じ結果が得られます。

しかし、ES6 ではオブジェクト リテラルが強化されているので、もう 1つできることがあります。 キーに対してそれを行うことができ、値は同じです。

削除できます。 ただし、残ったもので、同じ結果を得ることができます。

const Users = [
  ['John', 'Oliver'],
  ['James', 'Smith'],
  ['Mary', 'Elizabeth'],
];
[{
  firstName: 'John',
  lastName: 'Oliver',
},
 {
   firstName: 'James',
   lastName: 'Smith',
 },
 {
   firstName: 'Mary',
   lastName: 'Elizabeth',
 },
];
const UserObj = Users.map(([firstName, lastName]) => {
    return { firstName, lastName };
});

console.log(UserObj);

これが、デストラクチャリングを使用する方法です。

まとめ

この記事では、構造化解除とは何か、JavaScript でそれを実行する方法について説明しました。 React などの言語を使用する場合に便利です。

React を使っていなくても、きれいなコードを書くことができます。

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.