11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ES6 Destructuring (分割代入) で簡潔なコードを書こう!

Last updated at Posted at 2019-07-02

ES6(ES2015という名でも知られている)には、多くの新機能があって、その一つは destructuring assignment(分割代入)になりました。destructuring というのは、array(配列)やオブジェクトからのデータを取得する方法です。destructuringをよく使えば、コードがわかりやすくて簡潔になります。

本記事、ES6の destructuring について簡単に説明したいと思います。

対象者

  • ES6 destructuring については、まだ聞いたことない方
  • Javascript語でコードしているけど、ES6を使わない方
  • Javascript語でコードしていて、コードが簡潔にしたい方

概要

本記事には、下記とほぼ同じ代入文がよく書いてあります。

const { a, b } = object;

左側:代入されている変数
右側:この変数にデータを取得

ES6 Destructuring (分割代入) はだいたいそういうふうに書きますが、オブジェクトだけではなく、配列もString型も分割できます。それをもとに、本記事がいくつかの部分に分けています。

配列

ES6で、配列されているデータを分割代入できますが、まず、ES6がなしでの仕方を見ましょう。

const emojis = ['🙂', '🤣', '👿', '🤖'];
const smile = emojis[0];
const laugh = emojis[1];
console.log(smile, laugh); // 🙂 🤣

それは、何も間違っていませんが、下記にするのはどう思いますか?(ES6で)

const emojis = ['🙂', '🤣', '👿', '🤖'];
const [smile, laugh] = emojis;
console.log(smile, laugh); // 🙂 🤣

これで、もっとわかりやうくて簡潔になりましたが、いくつかのデータがいらないなら、どうしますか?

配列のデータを抜かすこと(スキップ)

配列を分割すると, いくつかのデータはいらないかもしれないので、それが抜かすことができます。 いくつかも抜かせます。

const emojis = ['🙂', '🤣', '👿', '🤖'];
const [smile,, devil] = emojis;
const [, laugh,, robot] = emojis;
console.log(smile, devil, laugh, robot); // 🙂 👿 🤣 🤖

rest オペレーターの使用

「rest」というのは、英語で「その他」という意味なので、このオペレーターを使うと、配列の他のデータを取得できます。restオペレーターは、... のシンタクスで使います。例えば:

const emojis = ['🙂', '🤣', '👿', '🤖'];
const [smile, laugh, ...notHuman] = emojis;
console.log(smile, laugh, notHuman); // 🙂 🤣 ['👿', '🤖']

繰り返し可能な変数(iterables)

iterable(繰り返し可能)な変数(String型など)も分割代入できます。

const alphabet = 'abcdefg';
const [a, b, c] = alphabet;
console.log(a, b, c); // a b c

オブジェクト

ES6で、オブジェクト(JSON型)されているデータも分割代入できます。

const user = {
  id: 1,
  name: 'Sam',
  age: 20
};

ES6がなしでの仕方で、こういうふうにします。

const id = user.id;
const name = user.name;
const age = user.age;

ES6の分割代入で:

const { id, name, age } = user;
console.log(id, name, age); // 1 Sam 20

この仕方では、変数の名前とオブジェクトのデータの名前が同じにしなければなりません。

他の名前を使うこと

上記に書いてあるのは、変数の名前とオブジェクトのデータの名前が同じにしなければなりませんが、他の名前も使えます。

const { originalName: newName } = object;

// 例えば
const { name: userName, age: userAge } = user;

欠席値 (default value) の定義

オブジェクトを分割して、オブジェクトの属性に値がない場合、欠席値 (default value) を定義することができます。

const { name, country = 'Philippines' } = user;

userという上記に書いてあるオブジェクトには、countryという属性がなかったので、undefinedになりますが、この default シンタクスで、countryPhilippinesという値が保存されます。

機能のパラメーター

// 上記に書いてあるuserオブジェクトを使って、自己紹介の機能
const introduction = ({ name, age, country }) => {
  console.log(`Hello! I am ${name}, ${age} years old from the ${country}`);
}
// Hello! I am Sam, 20 years old from the Philippines

入れ子にされた (nested) オブジェクト

普通のオブジェクトの書き方にちょっと違いますが、入れ子にされたオブジェクトにも分割代入できます。例えば:

const person = {
  name: 'Sam',
  age: 20,
  country: 'Philippines',
  parents: {
    father: 'Mario',
    mother: 'Sally'
  }
};

こういうオブジェクトありますが、parentsという属性だけを取得したいので、ES6がなしで、こうします:

const father = person.parents.father;
const mother = person.parents.mother;
console.log(father, mother); // Mario Sally

ES6で:

const { parents: { father, mother } } = person;
console.log(father, mother); // Mario Sally

コードがもっと読みやすくて簡潔になりました :thumbsup:

変数の交換(入れ替え)

ES6 Destructuring (分割代入) は、配列やオブジェクトだけのためではなく、変数の入れ替えにも使えます。例えば、このabという変数があります。

let a = 1;
let b = 2;

交換したいなら、もう一つの変数が必要になります。

let temp = a;
a = b;
b = temp;

その方法は、読みにくくて簡潔ではありませんが、ES6 Destructuring のおかげで、こういうコードだけでできます。

[a, b] = [b, c];

まとめ

上記の事例で、ES6 Destructuring (分割代入) を使えば、コードが短くて読みやすくなるということが見えます。なので、皆さんのコードには、こういうコード:

a = object.a;
b = object.b;
c = object.c;
d = object.d;
...
z = object.z;

// 🤣

があれば、ES6 Destructuring使用の良い機会になりますね。一緒にES6 Destructuring で簡潔なコードを書きましょう!

参考

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?