news

Rabu, 10 Juni 2020

Belajar Destructuring Object & Array Javascript


Potongan kode pada materi ini: 

Literasi objek dan array adalah dua hal yang paling banyak digunakan dalam mengelola data di JavaScript. JSON (JavaScript Object Notation) merupakan data format paling populer yang digunakan dalam transaksi data saat ini.


  1. [

  2.     {

  3.         "id": 14,

  4.         "title": "Menjadi Android Developer Expert",

  5.         "author": "Google ATP"

  6.     },

  7.     {

  8.         "id": 51,

  9.         "title": "Belajar Membuat Aplikasi Android untuk Pemula",

  10.       "author": "Google ATP"

  11.     },

  12.     {

  13.          "id": 74,

  14.          "title": "Membangun Progressive Web Apps",

  15.          "author": "Codepolitan"

  16.     },

  17.     {

  18.          "id": 123,

  19.          "title": "Belajar Dasar Pemrograman Web",

  20.          "author": "Dicoding Indonesia"

  21.     }

  22. ]



Jika kita lihat pada struktur JSON di atas, kita dapat menyimpulkan bahwa struktur tersebut dibangun dari sebuah array dan objek. Karena kedua hal ini banyak digunakan untuk mengelola data pada JavaScript, untuk memudahkan developer, ES6 menambahkan fitur untuk mendestruksikan objek dan array.
Tapi sebelum itu, apa sebenarnya destructuring object dan array itu? Destructuring pada JavaScript merupakan sintaks yang dapat mengeluarkan nilai dari array atau properties dari sebuah object ke dalam satuan yang lebih kecil.
Secara tidak sadar mungkin kita pernah melakukan destructuring, namun sebelum ES6 hal tersebut dilakukan dengan cara seperti ini:

  1. const foods = ['Pie', 'Cake', 'Honey']

  2.  

  3. const myFood = foods[0]

  4. const yourFood = foods[1]

  5. const ourFood = foods[2]

  6.  

  7. console.log(myFood, yourFood, ourFood)

  8.  

  9.  

  10. /* output:

  11. Pie Cake Honey

  12. */



  1. const profile = {

  2.     firstName: "John",

  3.     lastName: "Doe",

  4.     age: 18

  5. }

  6.  

  7. const firstName = profile.firstName

  8. const lastName = profile.lastName

  9. const age = profile.age

  10.  

  11. console.log(firstName, lastName, age)

  12.  

  13.  

  14. /* output:

  15. John Doe 18

  16. */



Perhatikan kode pada destructuring object di atas, Kode tersebut akan mengekstraksi nilai yang berada di dalam objek profile dan menyimpannya pada variabel lokal yang memiliki nama sama dengan properti di dalam objek profile
Mungkin mengekstraksi nilai dari objek dengan langkah ini terlihat mudah, namun bayangkan jika objek memiliki banyak properti dan harus melakukan hal tersebut secara manual satu persatu. Terlalu banyak kode yang dituliskan berulang kan?
Itulah alasan ES6 menambahkan fitur yang memudahkan kita untuk destructuring objek maupun array. Ketika kita ingin memecah struktur data menjadi bagian-bagian yang lebih kecil, kita akan dipermudah untuk mendapatkan data yang diinginkan.
Lantas bagaimana cara melakukan destructuring objek dan array pada ES6?

Destructuring Object

Penulisan destructuring object pada ES6 sintaks menggunakan objek literal { } di sisi kiri dari operasi assignment. 

  1. const profile = {

  2.     firstName: "John",

  3.     lastName: "Doe",

  4.     age: 18

  5. }

  6.  

  7. const {firstName, lastName, age} = profile;

  8.  

  9. console.log(firstName, lastName, age);

  10.  

  11. /* output:

  12. John Doe 18

  13. */



Pada contoh di atas tanda kurung kurawal { } merepresentasikan objek yang akan didestruksikan. Di dalamnya terdapat firstNamelastName, dan age yang merupakan variabel di mana kita menyimpan nilai properti dari objek profile
Kita juga perlu perhatikan penamaan variabel-variabelnya. Pastikan penamaannya sama seperti yang dimiliki oleh properti objeknya. 
Melalui nama variabel inilah nilai-nilai properti objek akan dimasukkan secara otomatis. Sehingga variabel firstName akan berisikan nilai profile.firstNamelastName akan berisikan nilai profile.lastName, begitu juga dengan variabel age akan berisikan nilai profile.age
Dalam destructuring object, kita bisa menspesifikasikan salah satu nilai yang ingin kita desktruksikan. Sehingga kita tidak perlu membuat variabel sebanyak properti yang dimiliki objeknya. contohnya:

  1. const {lastName} = profile;



Destructuring Assignment

Pada contoh sebelumnya kita melakukan destructuring object pada deklarasi variabel, namun pada kasus tertentu mungkin kita perlu melakukannya pada variabel yang sudah dideklarasikan. Atau kita ingin mengubah nilainya dengan nilai properti di objek. 
Dalam kasus tersebut, kita bisa melakukannya dengan seperti ini:

  1. const profile = {

  2.     firstName: "John",

  3.     lastName: "Doe",

  4.     age: 18

  5. }

  6.  

  7. let firstName = "Dimas";

  8. let age = 20;

  9.  

  10. // menginisialisasi nilai baru melalui object destruction

  11. ({firstName, age} = profile);

  12.  

  13. console.log(firstName);

  14. console.log(age);

  15.  

  16. /* output:

  17. John

  18. 18

  19. */


Saat melakukan destructuring assignment kita perlu menuliskan destructuring object di dalam tanda kurung. Jika tidak dituliskan di dalamnya, tanda buka kurung kurawal akan membuat JavaScript mengira kita membuat block statement, dan block statement tentu tidak bisa berada pada sisi kiri assignment

  1. // tidak bisa karena JavaScript mengira kita membuat block statement

  2. // block statement tidak bisa berada pada sisi kiri assignment

  3. {firstName, age} = profile;


Nah inilah fungsinya tanda kurung. Ia akan memberitahu JavaScript bahwa tanda kurawal yang di dalamnya bukan sebuah block statement, melainkan sebuah expression. Sehingga assignment dapat dilakukan.

  1. ({firstName, age} = profile);



Default Values

Ketika kita mendestruksikan objek dan kita menetapkan variabel dengan nama yang bukan merupakan properti dari objek, maka nilai dari variabel tersebut menjadi undefined. Contohnya:

  1. const profile = {

  2.     firstName: "John",

  3.     lastName: "Doe",

  4.     age: 18

  5. }

  6.  

  7.  

  8. const {firstName, age, isMale} = profile;

  9.  

  10. console.log(firstName)

  11. console.log(age)

  12. console.log(isMale)

  13.  

  14. /* output:

  15. John

  16. 18

  17. undefined

  18. */


Alternatifnya, kita bisa secara opsional mendefinisikan nilai default pada properti tertentu jika tidak ditemukan. Untuk melakukanya tambahkan tanda assignment (=) setelah nama variabel dan tentukan nilai defaultnya seperti ini:

  1. const profile = {

  2.     firstName: "John",

  3.     lastName: "Doe",

  4.     age: 18

  5. }

  6.  

  7.  

  8. const {firstName, age, isMale = false} = profile;

  9.  

  10. console.log(firstName)

  11. console.log(age)

  12. console.log(isMale)

  13.  

  14. /* output:

  15. John

  16. 18

  17. false

  18. */


Ketika menambahkan default value, jika properti tidak ditemukan nilai default akan diterapkan pada variabel.

Assigning to Different Local Variable Names

Sampai saat ini kita tahu bahwa untuk mendekstruksikan objek pada variabel lokal kita perlu menyeragamkan penamaan lokal variabel dengan properti objeknya. Namun sebenarnya dalam mendestruksikan objek kita bisa menggunakan penamaan variabel lokal yang berbeda. ES6 menyediakan sintaks tambahan yang membuat kita dapat melakukan hal tersebut. Penulisannya mirip seperti ketika kita membuat properti beserta nilainya pada objek. 
Contohnya seperti ini:

  1. const profile = {

  2.     firstName: "John",

  3.     lastName: "Doe",

  4.     age: 18

  5. }

  6.  

  7. const {firstName: localFirstName, lastName: localLastName, age: localAge} = profile;

  8.  

  9. console.log(localFirstName);

  10. console.log(localLastName);

  11. console.log(localAge);

  12.  

  13.  

  14. /* output:

  15. John

  16. Doe

  17. 18

  18. */



Destructuring Array

Destructuring Array serupa dengan destructuring object. Jika objek menggunakan tanda kurung kurawal { } sedangkan array menggunakan tanda kurung siku [ ]. Perbedaan lainnya adalah destructuring array bekerja berdasarkan posisi daripada penamaan propertinya. Berikut contoh dari destructuring array pada ES6:

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2.  

  3. const [firstFood, secondFood, thirdFood, fourthFood] = favorites;

  4.  

  5. console.log(firstFood);

  6. console.log(secondFood);

  7. console.log(thirdFood);

  8. console.log(fourthFood);

  9.  

  10. /* output:

  11. Seafood

  12. Salad

  13. Nugget

  14. Soup

  15. */



Contoh di atas merupakan proses destructuring array. Di dalam array tersebut (favorites) terdapat 4 (empat) nilai string yang masing-masing nilainya dimasukkan ke variabel lokal firstFoodsecondFoodthirdFood, dan fourthFood. Nilai pada array yang dimasukkan ke variabel lokal dipilih berdasarkan posisi di mana ia dideklarasikan pada array notasi. 

  1. const [firstFood, secondFood, thirdFood, fourthFood] = favorites;


Sebenarnya nama dari variabel lokal bisa apa saja. Yang terpenting adalah urutan ketika deklarasi variabelnya saja.
Kita juga bisa memilih nilai pada index tertentu untuk didestruksikan pada array. Contohnya jika kita ingin mengambil nilai ketiga dari array, kita tidak perlu menyiapkan lokal variabel untuk menampung nilai array pertama, kedua, atau pun keempat. Kita bisa melakukannya dengan membiarkan index array yang kita tidak inginkan tetap kosong (tanpa menulis variabel lokal). Lebih lanjut, tanda koma tetap (,) tetap diperlukan untuk menunjukkan posisi index-nya seperti ini:

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2.  

  3. const [, , thirdFood ] = favorites;

  4.  

  5. console.log(thirdFood);

  6.  

  7. /* output:

  8. Nugget

  9. */



Destructuring Assignment

Kita juga bisa melakukan destructuring assignment pada array. Namun tidak seperti objek, kita tidak perlu membungkusnya pada tanda kurung. Contohnya seperti berikut:

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2.  

  3. let myFood = "Ice Cream";

  4. let herFood = "Noodles";

  5.  

  6. [myFood, herFood] = favorites;

  7.  

  8. console.log(myFood);

  9. console.log(herFood);

  10.  

  11. /* output:

  12. Seafood

  13. Salad

  14. */


Array destructuring assignment sangat berguna ketika kita hendak menukar nilai antar dua variabel, sebelum ES6 untuk melakukan hal ini kita menggunakan cara manual menggunakan algoritma sorting seperti ini:

  1. var a = 1;

  2. var b = 2;

  3. var temp;

  4.  

  5. console.log("Sebelum swap");

  6. console.log("Nilai a: " + a);

  7. console.log("Nilai b: " + b);

  8.  

  9. temp = a;

  10. a = b;

  11. b = temp;

  12.  

  13. console.log("Setelah swap");

  14. console.log("Nilai a: " + a);

  15. console.log("Nilai b: " + b);

  16.  

  17. /* output

  18. Sebelum swap

  19. Nilai a: 1

  20. Nilai b: 2

  21. Setelah swap

  22. Nilai a: 2

  23. Nilai b: 1

  24. */


Untuk melakukan pertukaran nilai, kita membutuhkan variabel penengah. Pada contoh kode di atas variabel tersebut adalah temp. Variabel penengah dibutuhkan untuk menyimpan data sementara pada variabel yang akan ditukar. Hal ini menjadi kurang efektif karena kita harus membuat variabel baru yang sebenarnya hanya bersifat sementara.
Dengan array destructuring assignment kita bisa menukar nilai variabel dengan mudah dan tentu tanpa membuat variabel extra.  

  1. let a = 1;

  2. let b= 2;

  3.  

  4. console.log("Sebelum swap");

  5. console.log("Nilai a: " + a);

  6. console.log("Nilai b: " + b);

  7.  

  8. [a, b] = [b, a]

  9.  

  10. console.log("Setelah swap");

  11. console.log("Nilai a: " + a);

  12. console.log("Nilai b: " + b);

  13.  

  14. /* output

  15. Sebelum swap

  16. Nilai a: 1

  17. Nilai b: 2

  18. Setelah swap

  19. Nilai a: 2

  20. Nilai b: 1

  21. */



Default Values

Ketika melakukan array destructuring namun terdapat variabel yang posisinya tidak dapat terjangkau oleh array, maka variabel tersebut akan bernilai undefined. Contohnya:

  1. const favorites = ["Seafood"];

  2.  

  3. const [myFood, herFood] = favorites

  4.  

  5. console.log(myFood);

  6. console.log(herFood);

  7.  

  8. /* output:

  9. Seafood

  10. undefined

  11. */


Seperti objek, pada array destructuring kita juga dapat memberikan nilai default pada variabel yang tidak dapat terjangkau oleh array, sehingga nilai pada variabel tidak akan menjadi undefined.

  1. const favorites = ["Seafood"];

  2.  

  3. const [myFood, herFood = "Salad"] = favorites

  4.  

  5. console.log(myFood);

  6. console.log(herFood);

  7.  

  8. /* output:

  9. Seafood

  10. Salad

  11. */



Solution : Destructuring Object


Apakah Anda berhasil menerapkan destructuring object menggunakan pendekatan ES6? Jika belum, mari kita lakukan hal tersebut bersama-sama.
Tugas ini cukup mudah untuk dilakukan. Kita dapat mengubah kode berikut: 

  1. const name = club.name;

  2. const fanArt = club.fanArt;

  3. const description = club.description;



Dengan menerapkan destructuring object seperti ini:

  1. const {name, fanArt, description} = club;


Kita bisa lihat perubahannya. Ketika menggunakan destructuring object, kita dapat membuat kode yang tadinya memakan tiga baris, menjadi dituliskan dalam satu baris saja.
Untuk memastikan perubahan yang kita lakukan sudah benar, silakan Anda coba buka berkas index.html pada browser. Jika aplikasi berjalan dengan lancar, maka fitur destructuring objek berhasil diterapkan dengan baik.
Namun jika aplikasi tidak berjalan lancar, dan menghasilkan eror pada console browser, jangan malu untuk bertanya pada forum diskusi ya!

Langkah dari solution ini bisa Anda temukan juga pada repository berikut: https://github.com/dicodingacademy/a163-bfwd-labs/tree/104-club-finder-destructuring-object-solution