Salah satu pilar pemrograman fungsional adalah penggunaan khusus daftar dan operasi daftar. Dan hal-hal itu persis seperti apa terdengarnya: array dari berbagai hal, dan hal-hal yang kamu lakukan kepadanya. Tetapi pola pikir fungsional memperlakukannya sedikit berbeda dari yang kamu duga. Show Artikel ini akan melihat lebih dekat pada apa yang saya suka sebut operasi daftar "big three": var tasks = [43, var tasks = [44, dan var tasks = [45. Membungkus kepalamu di sekitar ketiga fungsi ini merupakan langkah penting untuk dapat menulis kode fungsional yang bersih, dan membuka pintu bagi teknik pemrograman fungsional dan reaktif yang sangat kuat. Ini juga berarti kamu tidak perlu menulis perulangan var tasks = [46 lagi. Ingin tahu? Mari kita selami. Peta Dari Daftar ke DaftarSeringkali, kita menemukan diri kita perlu mengambil array dan memodifikasi setiap elemen di dalamnya dengan cara yang persis sama. Contoh-contoh yang umum adalah mengkuadratkan setiap elemen dalam array angka, mengambil nama dari daftar pengguna, atau menjalankan regex pada suatu array string. var tasks = [43 adalah metode yang dibuat untuk melakukan hal itu. Ini didefinisikan pada var tasks = [48, sehingga kamu dapat memanggilnya di array apa pun, dan ia menerima callback sebagai argumen pertamanya. Ketika kamu memanggil var tasks = [43 pada suatu array, ia akan menjalankan callback tersebut pada setiap elemen di dalamnya, mengembalikan sebuah array baru dengan semua nilai yang dikembalikan oleh callback. Pada dasarnya, var tasks = [43 meneruskan tiga argumen ke callback-mu:
Mari kita lihat beberapa kode. var tasks = [ 43 dalam PrakteknyaMisalkan kita memiliki aplikasi yang mengelola berbagai tugasmu untuk hari itu. Setiap var tasks = [52 adalah objek, masing-masing dengan properti var tasks = [53 dan var tasks = [54: 1 // Durations are in minutes
2 3 var tasks = [ 4 5 {
6 7 // Durations are in minutes
0// Durations are in minutes
1// Durations are in minutes
2// Durations are in minutes
3// Durations are in minutes
4// Durations are in minutes
5// Durations are in minutes
6// Durations are in minutes
7// Durations are in minutes
8 {
20 21 22 23 24 25 26 27 // Durations are in minutes
629 30 {
32 33 34 35 36 37 38 39 var tasks = [0 var tasks = [1 var tasks = [2 var tasks = [3 Katakanlah kita ingin membuat array baru hanya dengan nama setiap tugas, sehingga kita dapat melihat semua yang telah kita selesaikan hari ini. Dengan menggunakan perulangan var tasks = [46, kita akan menulis sesuatu seperti ini: 1 var tasks = [5 2 3 var tasks = [8 4 5 41 6 7 44 JavaScript juga menawarkan perulangan var tasks = [56. Ini berfungsi seperti perulangan var tasks = [46, tetapi mengatur semua messiness memeriksa indeks perulangan kita terhadap panjang array untuk kita: 1 46 2 3 49 4 5 52 6 54 7 56 Dengan menggunakan var tasks = [43, kita bisa menulis: 1 58 2 3 {
14 5 {
4Saya menyertakan parmeter var tasks = [59 dan var tasks = [60 untuk mengingatkanmu bahwa mereka ada di sana jika kamu membutuhkannya. Karena saya tidak menggunakannya di sini, kamu bisa meninggalkannya, dan kode itu akan berjalan dengan baik. Ada beberapa perbedaan penting antara dua pendekatan tersebut:
Menghasilkan, semua fungsi yang akan kita lihat hari ini pada bagian karakteristik tersebut. Fakta bahwa kita tidak harus mengelola keadaan perulangan secara manual membuat kode kita lebih sederhana dan lebih mudah dipelihara. Fakta bahwa kita dapat beroperasi secara langsung pada elemen daripada harus mengindeks ke dalam array membuat hal-hal lebih mudah dibaca. Menggunakan perulangan var tasks = [56 memecahkan kedua masalah ini untuk kita. Tetapi var tasks = [43 masih memiliki setidaknya dua keuntungan berbeda:
Menjaga jumlah tempat di mana kamu mengubah keadaan ke minimum absolut adalah prinsip penting dari pemrograman fungsional. Itu membuat kode lebih aman dan lebih dimengerti. Sekarang juga saat yang tepat untuk menunjukkan bahwa jika kamu berada di Node, mengetes contoh ini di konsol browser Firefox, atau menggunakan Babel atau Traceur, kamu dapat menulis ini lebih singkat dengan fungsi panah ES6: 1 {
6Fungsi panah membiarkan kita meninggalkan kata kunci var tasks = [65 dalam satu baris. Itu tidak jauh lebih mudah dibaca daripada itu. GotchaCallback yang kamu teruskan ke var tasks = [43 harus memiliki pernyataan var tasks = [65 eksplisit, atau var tasks = [43 akan memuntahkan array yang dengan dengan var tasks = [66. Tidak sulit untuk mengingat memasukkan suatu nilai var tasks = [65, tetapi itu tidak sulit untuk dilupakan. Jika kamu lupa, var tasks = [43 tidak akan mengeluh. Sebaliknya, itu akan diam-diam mengembalikan array penuh dengan kekosongan. Error yang senyap seperti itu dapat sangat sulit untuk didebug. Untungnya, ini adalah satu-satunya gotcha dengan var tasks = [43. Tapi itu adalah perangkap yang cukup umum yang harus saya tekankan: Selalu pastikan callback-mu berisi pernyataan var tasks = [65! ImplementasiMembaca implementasi adalah bagian penting dari pemahaman. Jadi, mari tulis var tasks = [43 ringan kita sendiri untuk lebih memahami apa yang terjadi pada dasarnya. Jika kamu ingin melihat implementasi kualitas produksi, periksa Mozilla polyfill di MDN. 1 {
82 3 61 4 5 64 6 66 7 68 // Durations are in minutes
1// Durations are in minutes
271 // Durations are in minutes
4// Durations are in minutes
574 // Durations are in minutes
7// Durations are in minutes
877 20 21 // Durations are in minutes
0023 24 {
4Kode ini menerima array dan fungsi callback sebagai argumen. Ini kemudian membuat array baru; menjalankan callback pada setiap elemen pada array yang kita teruskan; mendorong hasil ke dalam array baru; dan mengembalikan array baru. Jika kamu menjalankan ini di konsolmu, kamu akan mendapatkan hasil yang sama seperti sebelumnya. Pastikan kamu menginisialisasi var tasks = [83 sebelum kamu mengetesnya! Meskipun kkita menggunakan perulangan for pada dasarnya, membungkusnya ke dalam fungsi menyembunyikan detail dan memungkinkan kita bekerja dengan abstraksi sebagai gantinya. Itu membuat kode kita lebih bersifat deklaratif—ia mengatakan apa yang harus dilakukan, bukan bagaimana melakukannya. Kamu akan menghargai betapa kodemu ini dibuat lebih mudah dibaca, dipelihara, dan, erm, mudah di-debug. Menyaring KebisinganSelanjutnya dari operasi array kita adalah var tasks = [44. Itu persis seperti apa terdengar: Dibutuhkan suatu array, dan menyaring elemen yang tidak diinginkan. Seperti var tasks = [43, var tasks = [44 didefinisikan pada var tasks = [48. Ini tersedia di berbagai array, dan kamu memberikannya callback sebagai argumen pertama. var tasks = [44 mengeksekusi callback itu pada setiap elemen dari array, dan memunculkan array baru yang hanya berisi elemen-elemen di mana callback itu mengembalikan nilai var tasks = [89. Juga seperti var tasks = [43, var tasks = [44 meneruskan tiga argumen callback-mu:
var tasks = [ 44 dalam PrakteknyaMari kita lihat kembali contoh tugas kita. Daripada menarik nama setiap tugas, katakanlah saya ingin mendapatkan daftar tugas yang membutuhkan waktu dua jam atau lebih untuk menyelesaikannya. Dengan menggunakan var tasks = [56, kita akan menulis: 1 // Durations are in minutes
052 3 // Durations are in minutes
084 // Durations are in minutes
105 // Durations are in minutes
126 // Durations are in minutes
147 {
4Dengan var tasks = [44: 1 // Durations are in minutes
182 // Durations are in minutes
203 {
44 5 // Durations are in minutes
256 // Durations are in minutes
27Di sini, saya telah melanjutkan dan meninggalkan argumen var tasks = [59 dan var tasks = [60 ke callback kita, karena kita tidak menggunakannya. Sama seperti var tasks = [43, var tasks = [44 memungkinkan kita:
GotchaCallback yang kamu berikan ke var tasks = [43 harus menyertakan pernyataan return jika kamu ingin berfungsi dengan benar. Dengan var tasks = [44, kamu juga harus menyertakan pernyataan pengembalian, dan kamu harus memastikannya mengembalikan nilai boolean. Jika kamu lupa pernyataan return, callback-mu akan mengembalikan var tasks = [66, yang mana var tasks = [44 tidak akan membantu dengan paksa ke 406. Daripada melemparkan error, itu akan secara senyap mengembalikan array kosong! Jika kamu menuju ke rute lain, dan mengembalikan sesuatu yang tidak secara eksplisit var tasks = [89 atau 406, kemudian var tasks = [44 akan mencoba untuk mencari tahu apa yang kamu maksud dengan menerapkan aturan paksaan JavaScript. Lebih sering daripada tidak, ini adalah bug. Dan, seperti melupakan pernyataan return-mu, itu akan menjadi pernyataan senyap. Selalu pastikan callbackmu menyertakan pernyataan return eksplisit. Dan selalu pastikan callback-mu di var tasks = [44 kembali mengembalikan nilai var tasks = [89 atau 406. Kewarasanmu akan berterima kasih. ImplementasiSekali lagi, cara terbaik untuk memahami sepotong kode adalah ... yah, dengan menulisnya. Mari kita gulirkan var tasks = [44 ringan kita sendiri. Orang-orang baik di Mozilla memiliki polyfill kekuatan industri untuk kamu baca juga. 1 // Durations are in minutes
292 3 // Durations are in minutes
324 5 64 6 // Durations are in minutes
377 // Durations are in minutes
39// Durations are in minutes
1// Durations are in minutes
41// Durations are in minutes
268 // Durations are in minutes
4// Durations are in minutes
5// Durations are in minutes
46// Durations are in minutes
7// Durations are in minutes
874 Mengurangi Arrayvar tasks = [43 membuat array baru dengan mengubah setiap elemen dalam array, secara terpisah. var tasks = [44 membuat array baru dengan menghapus elemen yang bukan miliknya. var tasks = [45, di sisi lain, mengambil semua elemen dalam array, dan menguranginya menjadi satu nilai. Sama seperti var tasks = [43 dan var tasks = [44, var tasks = [45 didefinisikan pada var tasks = [48 dan tersedia di array apa pun, dan kamu meneruskan callback sebagai argumen pertama. Tetapi ini juga membutuhkan argumen kedua yang opsional: nilai untuk mulai menggabungkan semua elemen array-mu ke dalamnya. var tasks = [45 meneruskan empat argumen callback-mu:
Perhatikan bahwa callback mendapat nilai sebelumnya pada setiap perulangan. Pada perulangan pertama, tidak ada nilai sebelumnya. Inilah sebabnya mengapa kamu memiliki pilihan untuk meneruskan var tasks = [45 suatu nilai awal: Ini bertindak sebagai "nilai sebelumnya" untuk perulangan pertama, ketika tidak ada yang akan menjadi yang pertama. Akhirnya, ingatlah bahwa var tasks = [45 mengembalikan nilai tunggal, bukan array yang berisi satu item. Hal ini lebih penting daripada yang terlihat, dan saya akan kembali ke contohnya. var tasks = [ 45 dalam PrakteknyaKarena var tasks = [45 adalah fungsi yang orang-orang temukan sebagai yang paling asing pada awalnya, kita akan mulai dengan berjalan selangkah demi selangkah melalui sesuatu yang sederhana. Katakanlah kita ingin mencari jumlah daftar angka. Menggunakan perulangan, itu terlihat seperti ini: 1 // Durations are in minutes
512 // Durations are in minutes
533 54 4 // Durations are in minutes
575 // Durations are in minutes
596 {
4Meskipun ini bukan kasus penggunaan yang buruk untuk var tasks = [56, var tasks = [45 masih memiliki keuntungan yang memungkinkan kita untuk menghindari mutasi. Dengan var tasks = [45, kita akan menulis: 1 // Durations are in minutes
632 // Durations are in minutes
653 // Durations are in minutes
67Pertama, kita memanggil var tasks = [45 pada daftar 431 kita. Kita memberikannya callback, yang menerima nilai sebelumnya dan nilai saat ini sebagai argumen, dan mengembalikan hasil penambahannya bersamaan. Karena kita meneruskan 432 sebagai argumen kedua untuk melakukan var tasks = [45, itu akan digunakan sebagai nilai 434 (sebelumnya) pada perulangan pertama. Jika kita selangkah demi selangkah, tampilannya seperti ini: PerulanganSebelumnyaSaat iniTotal10112123333646410510515Jika kamu bukan penggemar tabel, jalankan cuplikan ini di konsol: 1 // Durations are in minutes
692 // Durations are in minutes
713 // Durations are in minutes
734 // Durations are in minutes
755 // Durations are in minutes
776 // Durations are in minutes
797 // Durations are in minutes
67// Durations are in minutes
1// Durations are in minutes
2// Durations are in minutes
84Ringkasnya: var tasks = [45 melakukan perulangan atas semua elemen array, menggabungkan mereka namun kamu tentukan di callback-mu. Pada setiap iterasi, callback-mu memiliki akses ke nilai sebelumnya, yang merupakan total-sejauh-ini, atau nilai akumulasi; nilai saat ini; indeks saat ini; dan seluruh array, jika kamu membutuhkannya. Mari kita kembali ke contoh tugas kita. Kita telah mendapatkan daftar nama tugas dari var tasks = [43, dan daftar tugas yang difilter yang memakan waktu lama dengan ... yah, var tasks = [44. Bagaimana jika kita ingin mengetahui jumlah total waktu yang kita habiskan bekerja hari ini? Menggunakan perulangan var tasks = [56, kamu akan menulis: 1 // Durations are in minutes
862 54 3 49 4 // Durations are in minutes
925 // Durations are in minutes
946 // Durations are in minutes
967 56 Dengan var tasks = [45, itu menjadi: 1 200 2 202 3 204 4 5 207 6 209 Mudah. Itu hampir seluruh yang ada untuk hal itu. Hampir, karena JavaScript memberi kita satu metode yang lebih sedikit diketahui, yang disebut 440. Dalam contoh di atas, var tasks = [45 mulai pada item pertama dalam array, perulangan dari kiri ke kanan: 1 211 2 213 3 215 4 {
45 6 220 440 melakukan hal yang sama, tetapi dalam arah yang berlawanan: 1 222 2 224 3 226 4 56 5 6 231 Saya menggunakan var tasks = [45 setiap hari, tetapi saya tidak pernah membutuhkan 440. Saya rasa kamu mungkin tidak akan melakukannya juga. Tetapi jika kamu pernah melakukannya, sekarang kamu tahu itu ada di sana. GotchaTiga gotcha besar dengan var tasks = [45 adalah:
Untungnya, dua yang pertama mudah dihindari. Memutuskan apa nilai awalmu harus bergantung pada apa yang kamu lakukan, tetapi kamu akan cepat menguasainya. Yang terakhir mungkin tampak agak aneh. Jika var tasks = [45 hanya akan mengembalikan nilai tunggal, mengapa kamu mengharapkan sebuah array? Ada beberapa alasan bagus untuk itu. Pertama, var tasks = [45 selalu mengembalikan nilai tunggal, tidak selalu angka tunggal. Jika kamu mengurangi suatu array pada array-array, misalnya, ia akan mengembalikan array tunggal. Jika kamu dalam kebiasaan atau mengurangi array, akan adil untuk mengharapkan bahwa array yang berisi satu item tidak akan menjadi kasus khusus. Kedua, jika var tasks = [45 memang mengembalikan array dengan nilai tunggal, itu akan secara alami berjalan bagus dengan var tasks = [43 dan var tasks = [44, dan fungsi lain pada array yang mungkin kamu gunakan dengannya. ImplementasiSaatnya untuk tampilan terakhir kita pada dasarnya. Seperti biasa, Mozilla memiliki polyfill antipeluru untuk reduce jika kamu ingin memeriksanya. 1 233 2 235 3 54 4 239 5 241 6 68 7 54 // Durations are in minutes
1247 // Durations are in minutes
274 Dua hal yang perlu diperhatikan di sini:
Menggunakannya bersamaan: Map, Filter, Reduce, dan ChainabilityPada titik ini, kamu mungkin tidak begitu terkesan. Cukup adil: var tasks = [43, var tasks = [44, dan var tasks = [45, dengan sendirinya, tidak terlalu menarik. Setelah semua, kekuatan sejati mereka terletak pada keterkaitan mereka. Katakanlah saya ingin melakukan hal berikut:
Pertama, mari tentukan tugas-tugas kita untuk hari Senin dan Selasa: 1 251 2 253 3 255 4 257 5 259 6 253 7 263 // Durations are in minutes
1265 // Durations are in minutes
2// Durations are in minutes
41// Durations are in minutes
4269 // Durations are in minutes
5// Durations are in minutes
7272 // Durations are in minutes
8253 20 276 21 278 23 259 24 253 26 284 27 257 29 259 30 253 32 292 33 294 35 // Durations are in minutes
4136 269 38 54 39 302 Dan sekarang, transformasi kita yang indah: 1 304 2 306 3 308 4 310 5 312 6 314 7 316 // Durations are in minutes
1318 // Durations are in minutes
2320 // Durations are in minutes
4322 // Durations are in minutes
5324 // Durations are in minutes
7326 // Durations are in minutes
8328 20 330 21 332 Atau, lebih ringkas: 1 334 2 336 3 338 4 340 5 342 6 344 7 346 // Durations are in minutes
1348 // Durations are in minutes
2350 // Durations are in minutes
4352 // Durations are in minutes
5354 // Durations are in minutes
7356 // Durations are in minutes
8358 20 360 Jika kamu sudah sampai sejauh ini, ini seharusnya cukup mudah. Ada dua sedikit keanehan yang bisa dijelaskan. Pertama, pada baris 10, saya seharusnya menulis: 1 362 2 364 3 366 4 368 Dua hal yang perlu dijelaskan di sini:
Bit kedua yang mungkin membuatmu sedikit tidak nyaman adalah var tasks = [45 yang terakhir, yaitu: 1 362 2 372 3 374 4 376 5 378 6 {
4Itu memanggil var tasks = [43 untuk mengembalikan array yang berisi nilai tunggal. Di sini, kita memanggil var tasks = [45 untuk menarik keluar nilai itu. Cara lain untuk melakukan ini adalah dengan menghapus panggilan untuk mengurangi, dan mengindeks ke dalam array yang memuntahkan var tasks = [43: 1 382 2 384 3 386 4 388 5 390 6 392 7 394 // Durations are in minutes
1396 // Durations are in minutes
2398 // Durations are in minutes
4var tasks = [00 // Durations are in minutes
5var tasks = [02 // Durations are in minutes
7var tasks = [04 // Durations are in minutes
8var tasks = [06 Itu sangat benar. Jika kamu lebih nyaman menggunakan indeks array, silakan saja. Tetapi saya mendorongmu untuk tidak melakukannya. Salah satu cara paling ampuh untuk menggunakan fungsi-fungsi ini adalah dalam bidang pemrograman reaktif, di mana kamu tidak akan bebas menggunakan indeks array. Menendang kebiasaan itu sekarang akan membuat teknik belajar reaktif jauh lebih mudah dalam keseluruhannya. Akhirnya, mari kita lihat bagaimana teman kita perulangan var tasks = [56 akan menyelesaikannya: 1 var tasks = [08 2 var tasks = [10 3 var tasks = [12 4 var tasks = [14 5 var tasks = [16 6 7 var tasks = [19 // Durations are in minutes
1var tasks = [21 // Durations are in minutes
254 // Durations are in minutes
4var tasks = [25 // Durations are in minutes
5var tasks = [27 // Durations are in minutes
7var tasks = [29 // Durations are in minutes
856 20 21 var tasks = [34 23 var tasks = [36 24 56 26 27 29 var tasks = [42 Ditoleransi, tetapi ramai. Kesimpulan & Langkah BerikutnyaPada tutorial ini, kamu telah belajar bagaimana var tasks = [43, var tasks = [44, dan var tasks = [45 bekerja; bagaimana cara menggunakannya; dan kira-kira bagaimana mereka diimplementasikan. Kamu telah melihat bahwa mereka semua memungkinkanmu untuk menghindari keadaan mutasi, yang mengharuskan penggunaan perulangan var tasks = [46 dan 476, dan kamu sekarang seharusnya memiliki gagasan yang baik tentang bagaimana untuk menyatukan mereka semua. Sekarang, saya yakin kamu ingin berlatih dan membaca lebih lanjut. Berikut adalah tiga saran utama saya untuk ke mana harus menuju selanjutnya:
JavaScript telah menjadi salah satu bahasa de-facto yang bekerja di web. Bukan tanpa alur pembelajaran, dan ada banyak framework dan library untuk membuatmu sibuk juga. Jika kamu mencari sumber daya tambahan untuk dipelajari atau digunakan dalam pekerjaanmu, periksa apa yang kami miliki di Envato marketplace. Jika kamu ingin lebih banyak tentang hal semacam ini, cek profil saya dari waktu ke waktu; tangkap saya di Twitter (@PelekeS); atau klik blog saya di http://peleke.me. Pertanyaan, komentar, atau kebingungan? Biarkan mereka di bawah, dan saya akan melakukan yang terbaik untuk kembali ke masing-masing secara individual. |