Salah satu pilar pemrograman fungsional adalah penggunaan khusus dari register dan operasi register. Dan hal-hal persis seperti apa yang mereka dengar. array hal, dan hal-hal yang Anda lakukan untuk itu. Tetapi pola pikir fungsional memperlakukannya sedikit berbeda dari yang Anda duga
Artikel ini akan melihat lebih dekat apa yang saya suka sebut sebagai operasi registri "tiga besar". var tasks = [ 43, var tasks = [ 44, dan var tasks = [ 45. Membungkus kepala Anda di sekitar ketiga fungsi ini merupakan langkah penting untuk dapat menulis kode fungsional yang bersih, dan membuka pintu ke teknik pemrograman fungsional dan reaktif yang sangat kuat.
Ini juga berarti Anda tidak perlu menulis var tasks = [ 46 pengulangan lagi
Ingin tahu?
Peta Dari Daftar ke Daftar
Seringkali, kita mendapati diri kita perlu mengambil sebuah array dan memodifikasi setiap elemen di dalamnya dengan cara yang persis sama. Contoh umum adalah mengkuadratkan setiap elemen dalam larik angka, mengambil nama dari daftar pengguna, atau menjalankan regex pada larik string.
var tasks = [ _43 adalah metode yang dibuat untuk melakukan itu. Itu didefinisikan di var tasks = [ _48, sehingga Anda dapat memanggilnya di array apa pun, dan menerima panggilan balik sebagai argumen pertamanya
Saat Anda memanggil var tasks = [ 43 pada sebuah array, itu akan menjalankan panggilan balik pada setiap elemen di dalamnya, mengembalikan array baru dengan semua nilai yang dikembalikan oleh panggilan balik
Pada dasarnya, var tasks = [ _43 meneruskan tiga argumen ke callback Anda
- Item saat ini dalam array
- Indeks array dari item saat ini
- Seluruh array yang Anda sebut peta
Mari kita lihat beberapa kode
var tasks = [ _43 dalam Praktek
Katakanlah kita memiliki aplikasi yang mengatur berbagai tugas Anda 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 23var tasks = [ 45 { 67// 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 { 2021222324252627// Durations are in minutes 62930 { 3233343536373839var tasks = [ 0var tasks = [ 1var tasks = [ 2var tasks = [ 3
Katakanlah kita ingin membuat array baru hanya dengan nama setiap tugas, sehingga kita dapat melihat semua yang telah kita selesaikan hari ini. Menggunakan var tasks = [ _46 loop, kami akan menulis sesuatu seperti ini
1var tasks = [ 523var tasks = [ 845416744
JavaScript juga menawarkan iterasi var tasks = [ _56. Ini berfungsi seperti var tasks = [ 46 loop, tetapi mengatur semua kekacauan memeriksa indeks loop kami terhadap panjang array untuk kami
14623494552654756
Dengan menggunakan _______0________43, kita dapat menulis
15823 { 145 { 4
Saya menyertakan parameter var tasks = [ 59 dan var tasks = [ 60 untuk mengingatkan Anda bahwa mereka ada jika Anda membutuhkannya. Karena saya tidak menggunakannya di sini, Anda dapat mengabaikannya, dan kode akan berjalan dengan baik
Ada beberapa perbedaan penting antara kedua pendekatan tersebut
- Dengan menggunakan var tasks = [ _43, Anda tidak perlu mengelola status iterasi var tasks = [ 46 Anda sendiri
- Anda dapat mengoperasikan elemen secara langsung, daripada harus mengindeks ke dalam array
- Anda tidak perlu membuat larik baru dan melakukan var tasks = [ 63 di atasnya. var tasks = [ 43 mengembalikan semua produk jadi sekaligus, sehingga kita dapat dengan mudah menetapkan nilai pengembalian ke variabel baru
- Anda harus ingat untuk menyertakan pernyataan var tasks = [ _65 dalam panggilan balik Anda. Jika tidak, Anda akan mendapatkan larik baru yang diisi dengan var tasks = [ 66
Menghasilkan, semua fungsi yang akan kita lihat hari ini di bagian karakteristik
Fakta bahwa kita tidak perlu mengelola status perulangan secara manual membuat kode kita lebih sederhana dan lebih mudah dipelihara. Fakta bahwa kita dapat mengoperasikan elemen secara langsung daripada harus mengindeks ke dalam array membuat semuanya lebih mudah dibaca
Menggunakan iterasi var tasks = [ _56 menyelesaikan kedua masalah ini untuk kita. Tapi var tasks = [ 43 masih memiliki setidaknya dua keunggulan berbeda
- var tasks = [ _56 mengembalikan var tasks = [ 66, sehingga tidak terkait dengan metode array lainnya. var tasks = [ _43 mengembalikan array, sehingga Anda dapat menautkannya dengan metode array lainnya
- var tasks = [ 43 mengembalikan array dengan produk jadi, daripada meminta kami untuk mengubah array di dalam loop
Menjaga jumlah tempat di mana Anda mengubah status menjadi minimum mutlak adalah prinsip penting pemrograman fungsional. Itu membuat kode lebih aman dan lebih mudah dipahami
Sekarang juga saat yang tepat untuk menunjukkan bahwa jika Anda berada di Node, menguji contoh ini di konsol browser Firefox, atau menggunakan Babel atau Traceur, Anda dapat menulis ini lebih pendek dengan fungsi panah ES6
1 { 6
Fungsi panah memungkinkan kita meninggalkan kata kunci var tasks = [ 65 dalam satu baris
Tidak ada yang lebih mudah dibaca dari itu
Kena kau
Panggilan balik yang Anda berikan ke var tasks = [ _43 harus memiliki pernyataan var tasks = [ 65 yang eksplisit, atau var tasks = [ 43 akan mengeluarkan array yang var tasks = [ 66. Tidak sulit untuk mengingat untuk memasukkan nilai var tasks = [ 65, tetapi tidak sulit untuk melupakannya
Jika Anda lupa, var tasks = [ 43 tidak akan mengeluh. Sebaliknya, itu akan secara diam-diam mengembalikan array yang penuh dengan kekosongan. Kesalahan senyap seperti itu bisa sangat sulit untuk di-debug
Untungnya, ini adalah satu-satunya gotcha dengan var tasks = [ 43. Tapi itu jebakan yang cukup umum yang harus saya tunjukkan. Selalu pastikan panggilan balik Anda berisi pernyataan var tasks = [ 65
Penerapan
Membaca implementasi adalah bagian penting dari pemahaman. Jadi, mari kita menulis cahaya kita sendiri var tasks = [ 43 untuk lebih memahami apa yang pada dasarnya terjadi. Jika Anda ingin melihat implementasi kualitas produksi, lihat Mozilla polyfill di MDN
1 { 823614564666768// 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 8772021// Durations are in minutes 002324 { 4
Kode ini menerima array dan fungsi callback sebagai argumen. Ini kemudian membuat array baru; . Jika Anda menjalankan ini di konsol Anda, Anda akan mendapatkan hasil yang sama seperti sebelumnya. Pastikan Anda menginisialisasi var tasks = [ _83 sebelum Anda mengujinya
Meskipun pada dasarnya kita menggunakan perulangan for, membungkusnya dalam sebuah fungsi akan menyembunyikan detailnya dan memungkinkan kita untuk bekerja dengan abstraksi.
Itu membuat kode kita lebih deklaratif—ia mengatakan apa yang harus dilakukan, bukan bagaimana melakukannya. Anda akan menghargai betapa mudahnya kode Anda dibuat untuk dibaca, dipelihara, dan, erm, debug
Menyaring Kebisingan
Selanjutnya dari operasi array kami adalah var tasks = [ _44. Seperti itulah kedengarannya. Dibutuhkan array, dan menyaring elemen yang tidak diinginkan
Seperti var tasks = [ _43, var tasks = [ 44 didefinisikan dalam var tasks = [ 48. Ini tersedia dalam berbagai array, dan Anda memberinya panggilan balik sebagai argumen pertama. var tasks = [ _44 mengeksekusi callback pada setiap elemen array, dan membuat array baru yang hanya berisi elemen di mana callback mengembalikan nilai var tasks = [ 89
Juga seperti var tasks = [ _43, var tasks = [ 44 meneruskan tiga argumen ke callback Anda
- Barang saat ini
- Indeks saat ini
- Array yang Anda sebutkan adalah var tasks = [ 44
var tasks = [ _44 dalam Latihan
Mari kita lihat kembali contoh tugas kita. Alih-alih menarik nama setiap tugas, katakanlah saya ingin mendapatkan daftar tugas yang membutuhkan waktu dua jam atau lebih untuk diselesaikan
Menggunakan var tasks = [ _56, kami akan menulis
1________13______0523// Durations are in minutes 084// Durations are in minutes 105// Durations are in minutes 126// Durations are in minutes 147 { 4
Dengan var tasks = [ _44
1// Durations are in minutes 182// Durations are in minutes 203 { 445// Durations are in minutes 256// Durations are in minutes 27
Di sini, saya telah memperpanjang dan meninggalkan argumen var tasks = [ _59 dan var tasks = [ 60 ke panggilan balik kami, karena kami tidak menggunakannya
Sama seperti var tasks = [ _43, var tasks = [ 44 memungkinkan kita
- hindari mutasi array dalam iterasi var tasks = [ _56 atau var tasks = [ 46
- tetapkan hasilnya langsung ke variabel baru, daripada memasukkannya ke dalam array yang kita definisikan di tempat lain
Kena kau
Panggilan balik yang Anda berikan ke var tasks = [ _43 harus menyertakan pernyataan pengembalian jika Anda ingin berfungsi dengan benar. Dengan var tasks = [ _44, Anda juga harus menyertakan pernyataan pengembalian, dan Anda harus memastikan pernyataan tersebut mengembalikan nilai boolean
Jika Anda lupa pernyataan pengembalian, panggilan balik Anda akan mengembalikan var tasks = [ 66, yang var tasks = [ 44 tidak akan membantu dengan memaksa ke 406. Alih-alih melempar kesalahan, itu akan mengembalikan array kosong secara diam-diam
Jika Anda pergi ke rute lain, dan mengembalikan sesuatu yang tidak secara eksplisit var tasks = [ 89 atau 406, maka var tasks = [ 44 akan mencoba mencari tahu apa yang Anda maksud dengan menerapkan aturan pemaksaan JavaScript. Lebih sering daripada tidak, ini adalah bug. Dan, seperti melupakan pernyataan pengembalian Anda, itu akan menjadi pernyataan diam
Selalu pastikan panggilan balik Anda menyertakan pernyataan pengembalian yang eksplisit. Dan selalu pastikan panggilan balik Anda di var tasks = [ _44 mengembalikan nilai var tasks = [ 89 atau 406. Kewarasan Anda akan berterima kasih
Penerapan
Sekali lagi, cara terbaik untuk memahami sepotong kode adalah dengan. baik, dengan menulisnya. Ayo gulung var tasks = [ 44 ringan kita sendiri. Orang-orang baik di Mozilla memiliki polyfill kekuatan industri untuk Anda baca juga
1// Durations are in minutes 2923// Durations are in minutes 3245646// Durations are in minutes 377// Durations are in minutes 39// Durations are in minutes 1// Durations are in minutes 41// Durations are in minutes 2________20var tasks = [ _13_______4// Durations are in minutes 5// Durations are in minutes 46584________12174________
Mengurangi Array
var tasks = [ _43 membuat array baru dengan mengubah setiap elemen dalam array, secara terpisah. var tasks = [ 44 membuat larik 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 dalam larik apa pun, dan Anda meneruskan panggilan balik sebagai argumen pertama. Tapi ini juga membutuhkan argumen kedua opsional. value untuk mulai menggabungkan semua elemen array Anda ke dalamnya
var tasks = [
45 melewati empat argumen panggilan balik Anda
- Nilai sekarang
- Nilai sebelumnya
- Indeks saat ini
- Array yang Anda sebutkan adalah var tasks = [ 45
Perhatikan bahwa callback mendapatkan nilai sebelumnya pada setiap iterasi. Pada iterasi pertama, tidak ada nilai sebelumnya. Inilah mengapa Anda memiliki opsi untuk melanjutkan var tasks = [ 45 sebagai nilai awal. Ini bertindak sebagai "nilai sebelumnya" untuk iterasi pertama, ketika tidak ada yang menjadi yang pertama
Terakhir, ingat bahwa var tasks = [ _45 mengembalikan nilai tunggal, bukan larik yang berisi satu item. Ini lebih penting daripada yang terlihat, dan saya akan kembali ke contoh
var tasks = [ _45 dalam Praktek
Karena var tasks = [
_45 adalah fungsi yang pada awalnya dianggap paling asing oleh orang-orang, kita akan mulai dengan berjalan selangkah demi selangkah melalui sesuatu yang sederhana
Katakanlah kita ingin mencari jumlah dari daftar angka. Menggunakan loop, tampilannya seperti ini
1// Durations are in minutes 512// Durations are in minutes 533544// Durations are in minutes 575// Durations are in minutes 596 { 4
Meskipun ini bukan kasus penggunaan yang buruk untuk var tasks = [ 56, var tasks = [ 45 masih memiliki kelebihan yang memungkinkan kita menghindari mutasi. Dengan var tasks = [ _45, kami akan menulis
1// Durations are in minutes 632// Durations are in minutes 653// Durations are in minutes 67
Pertama, kami memanggil _______0________45 di 431 register kami. Kami memberinya panggilan balik, yang menerima nilai sebelumnya dan nilai saat ini sebagai argumen, dan mengembalikan hasil penjumlahan keduanya. Karena kami melewati 432 sebagai argumen kedua untuk melakukan var tasks = [
45, yang akan digunakan sebagai nilai (sebelumnya) 434 di loop pertama
Jika kita pergi langkah demi langkah, terlihat seperti ini
PerulanganSebelumnyaSaat iniTotal10112123333646410510515Jika Anda bukan penggemar tabel, jalankan cuplikan ini di konsol
1________13______692________13______713// Durations are in minutes 734// Durations are in minutes 755________13______776// Durations are in minutes 797// Durations are in minutes 67_______13___1____1______1______1_____1
Pendeknya. var tasks = [ 45 mengulangi semua elemen array, menggabungkannya dengan cara yang Anda tentukan dalam panggilan balik Anda. Pada setiap iterasi, panggilan balik Anda memiliki akses ke nilai sebelumnya, yang merupakan nilai total sejauh ini, atau akumulasi;
Mari kita kembali ke contoh tugas kita. Kami telah memperoleh daftar nama tugas dari var tasks = [ 43, dan daftar tugas yang difilter yang membutuhkan waktu lama. baik, var tasks = [ _44
Bagaimana jika kita ingin mengetahui jumlah total waktu yang kita habiskan untuk bekerja hari ini?
Menggunakan iterasi var tasks = [ _56, Anda akan menulis
1________13______86254317_______94// Durations are in minutes 925// Durations are in minutes 946// Durations are in minutes 96756
Dengan var tasks = [ _45, itu menjadi
120022023204452076209
Mudah
Cukup banyak yang ada untuk itu. Hampir, karena JavaScript memberi kita metode yang kurang dikenal, disebut 440. Pada contoh di atas, var tasks = [ _45 dimulai dari item pertama dalam larik, iterasi dari kiri ke kanan
1211221332154 { 456220
440 melakukan hal yang sama, tetapi berlawanan arah
12222224322645656231
Saya menggunakan var tasks = [ _45 setiap hari, tetapi saya tidak pernah membutuhkan 440. Saya kira Anda mungkin juga tidak. Tetapi jika Anda pernah melakukannya, sekarang Anda tahu itu ada
Kena kau
Tiga gotcha besar dengan var tasks = [ _45 adalah
- Lupa melakukan var tasks = [ _65
- Lupakan nilai awalnya
- Mengharapkan array ketika var tasks = [ _45 mengembalikan satu nilai
Untungnya, dua yang pertama mudah dihindari. Memutuskan berapa nilai awal Anda bergantung pada apa yang Anda lakukan, tetapi Anda akan segera menguasainya
Yang terakhir mungkin tampak sedikit aneh. Jika var tasks = [ 45 hanya akan mengembalikan satu nilai, mengapa Anda mengharapkan sebuah array?
Ada beberapa alasan bagus untuk itu. Pertama, var tasks = [ 45 selalu mengembalikan satu nilai, tidak selalu satu angka. Jika Anda mengurangi larik demi larik, misalnya, ia akan mengembalikan satu larik. Jika Anda menggunakan larik khusus atau yang dikurangi, akan adil untuk berharap bahwa larik yang berisi satu item tidak akan menjadi kasus khusus
Kedua, jika var tasks = [ _45 mengembalikan array nilai tunggal, secara alami akan cocok dengan var tasks = [ 43 dan var tasks = [ 44, dan fungsi lain pada array yang mungkin Anda gunakan dengannya
Penerapan
Saatnya untuk melihat terakhir kita di pangkalan. Seperti biasa, Mozilla memiliki polyfill antipeluru untuk dikurangi jika Anda ingin memeriksanya
12332____14_______3535442___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________g
Dua hal yang perlu diperhatikan di sini
- Kali ini, saya menggunakan nama 453 dari 434. Inilah yang biasanya Anda lihat di alam liar
- Saya menetapkan 4_53 sebagai nilai awal, jika pengguna memberikannya, dan default ke 432, jika tidak. Beginilah perilaku var tasks = [ _45 yang asli juga
Gunakan mereka bersama-sama. Memetakan, Memfilter, Mengurangi, dan Kemampuan Berantai
Pada titik ini, Anda mungkin tidak terlalu terkesan
Cukup adil. var tasks = [ 43, var tasks = [ 44, dan var tasks = [ 45, dengan sendirinya, tidak terlalu menarik
Bagaimanapun, kekuatan sejati mereka terletak pada keterhubungan mereka
Katakanlah saya ingin melakukan hal berikut
- Mengumpulkan tugas selama dua hari
- Ubah durasi tugas menjadi jam, bukan menit
- Memfilter semua yang membutuhkan waktu dua jam atau lebih
- Tambahkan semuanya
- Kalikan hasilnya dengan tarif per jam untuk penagihan
- Menghasilkan output jumlah dolar yang diformat
Pertama, mari kita tentukan tugas kita untuk hari Senin dan Selasa
1251225332554257525962537263// 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 82532027621278232592425326284272572925930253322923329435// Durations are in minutes 4136269385439302
Dan sekarang, transformasi indah kita
1304230633084310531263147316// 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 83282033021332
Atau, lebih sederhana
1334233633384340534263447346// 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 835820360
Jika Anda sudah sampai sejauh ini, ini seharusnya cukup mudah. Ada dua keanehan kecil yang bisa dijelaskan
Pertama, pada baris 10, saya harus menulis
1362236433664368
Ada dua hal yang perlu diklarifikasi di sini
- Tanda tambah di depan 4_53 dan 462 memaksa nilainya menjadi angka. Jika Anda tidak melakukan ini, nilai yang dikembalikan akan berupa string yang agak tidak berguna, 463
- Tanpa membungkus jumlah dalam tanda kurung, var tasks = [
45 akan mengembalikan nilai tunggal, bukan array. Itu akan berakhir dengan melempar 4_65, karena Anda hanya dapat menggunakan var tasks = [
43 pada array
Bagian kedua yang mungkin membuat Anda sedikit tidak nyaman adalah var tasks = [ 45 terakhir, yaitu
136223723374437653786 { 4
Itu memanggil var tasks = [ _43 untuk mengembalikan array yang berisi nilai tunggal. Di sini, kami memanggil var tasks = [ _45 untuk mengeluarkan nilai itu
Cara lain untuk melakukan ini adalah dengan menghapus panggilan untuk mengurangi, dan mengindeks ke dalam array yang mengeluarkan var tasks = [ 43
1382238433864388539063927394// 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 benar sekali. Jika Anda lebih nyaman menggunakan indeks array, lanjutkan
Tapi saya mendorong Anda untuk tidak melakukannya. Salah satu cara paling ampuh untuk menggunakan fungsi ini adalah di ranah pemrograman reaktif, di mana Anda tidak akan bebas menggunakan indeks array. Menendang kebiasaan itu sekarang akan membuat teknik pembelajaran reaktif jauh lebih mudah secara keseluruhan
Akhirnya, mari kita lihat bagaimana iterasi teman kita var tasks = [ 56 akan menyelesaikannya
1var tasks = [ 082var tasks = [ 103var tasks = [ 124var tasks = [ 145var tasks = [ 1667var 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 8562021var tasks = [ 3423var tasks = [ 362456262729var tasks = [ 42
Ditoleransi, tapi ramai
Kesimpulan & Langkah Selanjutnya
Dalam tutorial ini, Anda telah mempelajari cara kerja var tasks = [ _43, var tasks = [ 44, dan var tasks = [ 45; . Anda telah melihat bahwa mereka semua memungkinkan Anda untuk menghindari kondisi mutasi, yang membutuhkan penggunaan iterasi var tasks = [ 46 dan 476, dan Anda sekarang harus memiliki ide bagus tentang bagaimana menggabungkan semuanya
Sekarang, saya yakin Anda ingin berlatih dan membaca lebih lanjut. Berikut adalah tiga saran teratas saya untuk ke mana harus pergi selanjutnya
- Tutorial luar biasa Jafar Husain tentang Pemrograman Fungsional dalam JavaScript, lengkap dengan pengantar Rx yang solid. js
- Instruktur Kursus Envato Tuts+ Jason Rhodes tentang Pemrograman Fungsional dalam JavaScript
- Panduan Utama untuk Pemrograman Fungsional, yang membahas lebih dalam mengapa kita menghindari mutasi, dan pemikiran fungsional secara umum
JavaScript telah menjadi salah satu bahasa de-facto yang berfungsi di web. Bukan tanpa kurva belajar, dan ada banyak kerangka kerja dan perpustakaan untuk membuat Anda sibuk juga. Jika Anda mencari sumber daya tambahan untuk dipelajari atau digunakan dalam pekerjaan Anda, lihat apa yang kami miliki di pasar Envato
Jika Anda menginginkan lebih banyak tentang hal semacam ini, periksa profil saya dari waktu ke waktu; . //kotoran. Saya
Pertanyaan, komentar, atau kebingungan?