🌸ES6スプレッドオペレータの7つの使い方を覚えるべきこと🌸
ES6スプレッドオペレータは、JavaScript開発者にとって強力なツールです。それは、配列、マップ、セット、オブジェクトなどの反復可能なオブジェクトの要素を「展開」するために使用できる3つの点(...
)のセットです。
たとえば、arr
という数字の配列がこのように見えるとします:[1, 2, 3, 4, 5]
。配列をループし、各要素をconsole.log
する代わりに、単にスプレッドオペレータを使用して配列を出力することができます:console.log(...arr) // 1 2 3 4 5
const arr = [ 1, 2, 3, 4, 5 ]
console.log(arr) // [ 1, 2, 3, 4, 5 ]
console.log(...arr) // 1 2 3 4 5
const { name, ...other } = { name: 'tuan', age: 100, luckyNumber: 6 }
console.log(name) // tuan
console.log(other) // { age: 100, luckyNumber: 6 }
しかし、スプレッドオペレータはそれだけではできることがたくさんあります!ここに使用できる他のトリックのいくつかがあります:
1. 配列のpush()
メソッドを使用するより良い方法
すべての人は、push()
メソッドが複数の不確定なパラメータを渡すことをサポートすることを知っています。
const arr = [ 'tuan', 'medium' ]
arr.push(...[ 'JavaScript', 'NodeJs' ])
console.log(arr) // ['tuan', 'medium', 'JavaScript', 'NodeJs']
この例では、配列['JavaScript', 'NodeJs']
の要素をスプレッドオペレータで展開し、スプレッドした要素をpush
メソッドの引数として使用して、複数の要素を一行でarrに追加できるようにしています。
2. 新しい配列をコピー(シャロークローン)
配列をコピーすることは、スプレッドオペレータの最も便利な機能の1つですが、スプレッドオペレータは配列自体をコピーするだけであり、要素をコピーしません。したがって、もとの配列がオブジェクトを含んでいる場合、コピーに対して行われた変更は、同じオブジェクトを参照しているため、元の配列にも影響を与えます。
const originalArray = [1, 2, {a: 1, b: 2}];
const copyArr = [...originalArray];
console.log(copyArr); // [1, 2, {a: 1, b: 2}]
copyArr[2].a = 3;
console.log(originalArray); // [1, 2, {a: 3, b: 2}]
もし配列の中身も含めた本当のコピーを作りたい場合、 JSON.parse(JSON.stringify(originalArray))
などのディープコピー関数を使用することができます。
const originalArray = [1, 2, {a: 1, b: 2}];
const copyArr = JSON.parse(JSON.stringify(originalArray));
console.log(copyArr); // [1, 2, {a: 1, b: 2}]
copyArr[2].a = 3;
console.log(originalArray); // [1, 2, {a: 1, b: 2}]
ただし、この方法はJSONに準拠したデータのみに対応し、大きな配列を扱っている場合はパフォーマンスに問題が出る可能性があります。また、JSON.parse(JSON.stringify(originalArray))
メソッドはoriginalArray
に関数やシンボル、undefined値が含まれている場合は機能しません。
またLodash
やRamda
のようなライブラリを使うことで、配列やオブジェクトのディープコピーを作りながら、非JSONデータ型を保持することもできます。
3. 配列から重複した値を削除
重複した値の配列はset
データ構造とスプレッドオペレータを使って削除することができます。
const arr = [ 'tuan', 'tuan', 'medium', 'medium' ]
const uniqueArray = [ ...new Set(arr) ]
console.log(uniqueArray) // ['tuan', 'medium']
4. 複数の配列を結合
スプレッドオペレータを使用して、複数の配列を連鎖して新しいデータを取得することができます。
const arr1 = [ 'tuan', 'medium' ]
const arr2 = [ 'JavaScript', 'NodeJs' ]
const arr = [ ...arr1, ...arr2 ]
console.log(arr) // ['tuan', 'medium', 'JavaScript', 'NodeJs']
5. NodeListを本物の配列に変換
スプレッドオペレータは、DOM要素のリストであるNodeListを本物の配列に変換するために使用できます。
// $divs is a NodeList
const $divs = document.querySelectorAll('div')
// $arrayDivs is An Array
const $arrayDivs = [ ...$divs ]
console.log(Array.isArray($divs), Array.isArray($arrayDivs)) // false true
6. デストラクチャ
スプレッドオペレータは、配列やオブジェクトをデストラクチャするためによく使用されます。見てみましょう!
Destructure array:
const [ num0, ...others ] = [ 1, 2, 3, 4, 5, 6 ]
console.log(num0) // 1
console.log(others) // [2, 3, 4, 5, 6]
Destructure object:
const obj = { name: 'tuan', age: 100, luckyNumber: 6 }
const { name, ...other } = obj
console.log(name) // tuan
console.log(other) // { age: 100, luckyNumber: 6 }
7. 文字列を配列に変換
このように文字列を配列に変換することができるということは驚きですよね?
const name = 'tuan'
const nameArray = [ ...name ] // ['t', 'u', 'a', 'n']
結論
スプレッドオペレータ(...
)は、コードをシンプルにし、効率的にするための強力なツールです。反復可能なオブジェクト、配列、セット、マップ、オブジェクトの要素を展開することができます。配列をマージする、配列をコピーする、重複を削除する、配列やオブジェクトをデストラクチャする、NodeList
や文字列を配列に変換するタスクに使用できます。
しかし、スプレッドオペレータは浅いコピーを作成するため、コピーされた配列に対して行われた変更は元の配列に影響します。そのため、必要に応じてJSON.parse(JSON.stringify(originalArray))
やlodash
やRamda
のようなライブラリを使用してディープコピーを作成する必要があります。
Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.
Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.
Momo: NGUYỄN ANH TUẤN - 0374226770
TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)
All rights reserved