Chaining filter dan map javascript

Pemrograman fungsional telah membuat percikan di dunia pengembangan akhir-akhir ini. Dan untuk alasan yang bagus. Teknik fungsional dapat membantu Anda menulis lebih banyak kode deklaratif yang lebih mudah dipahami secara sekilas, refactor, dan pengujian

Salah satu landasan pemrograman fungsional adalah penggunaan khusus daftar dan operasi daftar. Hal-hal itu persis seperti apa kedengarannya. array hal-hal dan hal-hal yang Anda lakukan untuk mereka. Tetapi pola pikir fungsional memperlakukan mereka sedikit berbeda dari yang Anda duga

Cara Menggunakan Map, Filter, dan Reduce di JavaScript

Chaining filter dan map javascript

Artikel ini akan mencermati apa yang saya suka sebut sebagai operasi daftar "tiga besar".

3
26,
3
27, dan
3
28. Membungkus kepala Anda di sekitar ketiga fungsi ini adalah langkah penting untuk dapat menulis kode yang bersih dan fungsional, dan ini membuka pintu ke teknik pemrograman fungsional dan reaktif yang sangat kuat.

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 dari hal ini adalah mengkuadratkan setiap elemen dalam larik angka, mengambil nama dari daftar pengguna, atau menjalankan regex terhadap larik string

3
26 adalah metode yang dibuat untuk melakukan hal itu. Itu didefinisikan pada
3
_30, sehingga Anda dapat memanggilnya pada array apa pun, dan ia menerima panggilan balik sebagai argumen pertamanya.  

Sintaks untuk

3
_26 ditunjukkan di bawah ini

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
  // return element for newArray, after executing something

3
}[, thisArg]);

Saat Anda memanggil 

3
26 pada sebuah array, itu mengeksekusi callback tersebut pada setiap elemen di dalamnya, menampilkan array baru dengan semua nilai yang dikembalikan oleh callback

Di balik layar, 

3
_26 meneruskan tiga argumen ke callback Anda

  1. item saat ini dalam array
  2. indeks array dari item saat ini
  3. seluruh array yang Anda panggil
    3
    _26

Mari kita lihat beberapa kode

3_26 dalam Latihan

Misalkan kita memiliki aplikasi yang mengelola berbagai tugas Anda untuk hari itu. Setiap 

3
_36 adalah objek, masing-masing dengan ________0______37 dan 
3
38 properti

1
// Durations are in minutes 

2
const tasks = [
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
5
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
7
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
1
2
0
2
1
2
2
2
3
2
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
7
2
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
1
2
8
2
9
  // return element for newArray, after executing something

0
  // return element for newArray, after executing something

1
  // return element for newArray, after executing something

2
  // return element for newArray, after executing something

3
  // return element for newArray, after executing something

4
  // return element for newArray, after executing something

5

Katakanlah kita ingin membuat array baru hanya dengan nama setiap tugas, sehingga kita dapat melihat semua yang telah kita lakukan hari ini. Menggunakan

3
_39 loop, kami akan menulis sesuatu seperti ini

1
  // return element for newArray, after executing something

7
2
  // return element for newArray, after executing something

9
3
3
1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
3
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
3
5
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
3
8

JavaScript juga menawarkan

3
40 loop. Ini berfungsi seperti loop 
3
39, tetapi mengelola semua kekacauan saat memeriksa indeks loop kami terhadap panjang array untuk kami

1
  // return element for newArray, after executing something

7
2
  // return element for newArray, after executing something

9
3
}[, thisArg]);
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2________11______6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
}[, thisArg]);
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8________0______8

Menggunakan

3
_26, kita cukup menulis

1
1
3
2
1
5
3
}[, thisArg]);
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
// Durations are in minutes 

0

Di sini saya menyertakan parameter

3
43 dan  
3
44 untuk mengingatkan Anda bahwa parameter tersebut ada jika Anda membutuhkannya. Karena saya tidak menggunakannya di sini, Anda dapat mengabaikannya, dan kode akan berjalan dengan baik

Cara penulisan yang lebih ringkas

3
26 dalam JavaScript modern adalah dengan fungsi panah

1
// Durations are in minutes 

2
2
3
// Durations are in minutes 

5

Fungsi panah adalah bentuk pendek untuk fungsi satu baris yang hanya memiliki pernyataan

3
46. Tidak ada yang lebih mudah dibaca dari itu

Ada beberapa perbedaan penting antara pendekatan yang berbeda

  1. Menggunakan
    3
    _26, Anda tidak perlu mengatur sendiri status
    3
    39
  2. Dengan
    3
    _26, Anda dapat mengoperasikan elemen secara langsung, daripada harus mengindeks ke dalam array
  3. Anda tidak perlu membuat larik baru dan
    3
    50 ke dalamnya.
    3
    26 mengembalikan produk jadi sekaligus, jadi kita cukup menetapkan nilai yang dikembalikan ke variabel baru
  4. Anda harus ingat untuk menyertakan 
    3
    46 pernyataan dalam callback Anda. Jika tidak, Anda akan mendapatkan larik baru yang diisi dengan
    3
    53.  

Ternyata, semua fungsi yang akan kita lihat hari ini memiliki karakteristik yang sama

Fakta bahwa kita tidak perlu mengelola keadaan loop secara manual membuat kode kita lebih sederhana dan lebih mudah dipelihara. Fakta bahwa kita dapat mengoperasikan elemen secara langsung alih-alih harus mengindeks ke dalam array membuat semuanya lebih mudah dibaca.  

Menggunakan loop 

3
_40 memecahkan kedua masalah ini untuk kita. Namun 
3
26 masih memiliki setidaknya dua keunggulan berbeda

  1. 3
    40 mengembalikan 
    3
    53, sehingga tidak terhubung dengan metode array lainnya.
    3
    26 menampilkan larik, sehingga Anda dapat menghubungkannya dengan metode larik lainnya
  2. 3
    26 mengembalikan array dengan produk jadi, daripada mengharuskan kita untuk mengubah larik di dalam loop.  

Menjaga jumlah tempat di mana Anda memodifikasi keadaan seminimal mungkin adalah prinsip penting pemrograman fungsional. Itu membuat kode lebih aman dan lebih dimengerti

Gotcha

Callback yang Anda teruskan ke 

3
26 harus memiliki pernyataan eksplisit 
3
46, atau 
3
26 akan mengeluarkan array yang penuh dengan 
3
53. Tidak sulit untuk mengingat untuk menyertakan nilai 
3
46, tetapi tidak sulit untuk melupakannya.  

Jika Anda lupa, 

3
_26 tidak akan mengeluh. Sebaliknya, itu diam-diam akan mengembalikan array yang tidak berisi apa-apa. Kesalahan diam seperti itu bisa sangat sulit untuk di-debug.  

Untungnya, ini adalah satu-satunya gotcha dengan 

3
26. Tapi itu jebakan yang cukup umum yang harus saya tekankan. Selalu pastikan callback Anda berisi pernyataan ________0______46

Penerapan

Membaca implementasi merupakan bagian penting dari pemahaman. Jadi mari kita menulis

3
26 ringan kita sendiri untuk lebih memahami apa yang terjadi di bawah tenda. Jika Anda ingin melihat implementasi kualitas produksi, lihat polyfill Mozilla di MDN

1
// Durations are in minutes 

7
2
// Durations are in minutes 

9
3
  // return element for newArray, after executing something

9____7_______2
2
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ E jelas

Kode ini menerima array dan fungsi callback sebagai argumen. Itu kemudian membuat larik baru, mengeksekusi panggilan balik pada setiap elemen pada larik yang kami lewati, mendorong hasilnya ke dalam larik baru, dan mengembalikan larik baru. Jika Anda menjalankan ini di konsol Anda, Anda akan mendapatkan hasil yang sama seperti sebelumnya.  

Saat kita menggunakan for loop di bawah tenda, membungkusnya menjadi sebuah fungsi akan menyembunyikan detailnya dan memungkinkan kita bekerja dengan abstraksi sebagai gantinya.  

Hal itu membuat kode kita lebih bersifat deklaratif—dia mengatakan apa yang harus dilakukan, bukan bagaimana melakukannya. Anda akan menghargai betapa lebih mudah dibaca, dipelihara, dan, erm, debuggable ini dapat membuat kode Anda

Saring Kebisingan

Operasi larik kita berikutnya adalah

3
27. Itu persis seperti apa kedengarannya. Dibutuhkan array dan menyaring elemen yang tidak diinginkan

Sintaks untuk filter adalah

1
const tasks = [
5
2
const tasks = [
7
3
}[, thisArg]);

Sama seperti

3
_26,
3
27 melewati panggilan balik Anda tiga argumen

  1. item saat ini
  2. indeks saat ini
  3. larik yang Anda panggil
    3
    _27

Pertimbangkan contoh berikut, yang memfilter string apa pun yang kurang dari 8 karakter

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
01
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
03________0__7_______05

Hasil yang diharapkan akan

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
07

Mari kita lihat kembali contoh tugas kita. Alih-alih mengeluarkan nama setiap tugas, katakanlah saya ingin mendapatkan daftar hanya tugas yang membutuhkan waktu dua jam atau lebih untuk saya selesaikan

Menggunakan

3
_40, kami akan menulis

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
09
2
  // return element for newArray, after executing something

9
3
}[, thisArg]);
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
15
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
17
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
19
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
}[, thisArg]);
8
2
0
2
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
24
2
4
2
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
27
2
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
29
  // return element for newArray, after executing something

0
let newArray = arr.map(callback(currentValue[, index[, array]]) {
31

Dengan

3
_27, kita cukup menulis

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
33

Sama seperti

3
_26,
3
27 memungkinkan kita

  • menghindari mutasi array di dalam
    3
    40 atau
    3
    39 loop
  • tetapkan hasilnya langsung ke variabel baru, daripada mendorong ke dalam array yang kita definisikan di tempat lain

Gotcha

Callback yang Anda teruskan ke 

3
_26 harus menyertakan pernyataan pengembalian jika Anda ingin berfungsi dengan baik. Dengan 
3
_27, Anda juga harus menyertakan pernyataan pengembalian (kecuali jika Anda menggunakan fungsi panah), dan Anda harus memastikan pernyataan tersebut mengembalikan nilai boolean

Jika Anda lupa pernyataan pengembalian, panggilan balik Anda akan mengembalikan

3
53, yang 
3
27 akan memaksa ke
3
83. Alih-alih melempar kesalahan, itu akan mengembalikan array kosong secara diam-diam.  

Jika Anda mengambil rute lain dan mengembalikan sesuatu yang tidak secara eksplisit 

3
84 atau
3
83, maka 
3
27 akan mencoba mencari tahu apa yang Anda maksud dengan menerapkan aturan pemaksaan jenis JavaScript. Lebih sering daripada tidak, ini adalah bug. Dan, seperti melupakan pernyataan pengembalian Anda, itu akan menjadi diam.  

Selalu pastikan callback Anda menyertakan pernyataan pengembalian yang eksplisit. Dan selalu pastikan callback Anda di 

3
27 return
3
84 atau
3
83. Kewarasan Anda akan berterima kasih

Penerapan

Sekali lagi, cara terbaik untuk memahami sebuah kode adalah. baik, untuk menulisnya. Ayo gulung

3
27 ringan kita sendiri. Orang-orang baik di Mozilla memiliki polyfill berkekuatan industri untuk Anda baca juga

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
35
2
  // return element for newArray, after executing something

9
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
39
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
  // return element for newArray, after executing something

9
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
43
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
45
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
47
2
0
let newArray = arr.map(callback(currentValue[, index[, array]]) {
49
2
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
51
2
4
  // return element for newArray, after executing something

9
2
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
55
2
8
  // return element for newArray, after executing something

9
  // return element for newArray, after executing something

0
const tasks = [
3

Metode Pengurangan

Sintaks untuk metode array

3
_28 dalam JavaScript adalah

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
61
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
63
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
65

3
_26 membuat array baru dengan mengubah setiap elemen dalam array satu per satu.
3
_27 membuat array baru dengan menghapus elemen yang bukan miliknya.
3
28, di sisi lain, mengambil semua elemen dalam array dan menguranginya menjadi satu nilai

Sama seperti

3
26 dan 
3
27, 
3
28 didefinisikan pada 
3
30 dan juga tersedia pada larik apa pun, dan Anda meneruskan panggilan balik sebagai argumen pertamanya. Tapi itu juga membutuhkan argumen kedua. nilai untuk mulai menggabungkan semua elemen array Anda.  

3
28 melewati panggilan balik Anda empat argumen

  1. nilai saat ini
  2. nilai sebelumnya
  3. indeks saat ini
  4. larik yang Anda panggil 
    3
    _28

Perhatikan bahwa callback mendapatkan nilai sebelumnya pada setiap iterasi. Pada iterasi pertama, tidak ada nilai sebelumnya. Inilah mengapa Anda memiliki opsi untuk meneruskan 

3
28 nilai awal. Ini bertindak sebagai "nilai sebelumnya" untuk iterasi pertama, bila sebaliknya tidak akan ada

Terakhir, ingatlah bahwa 

3
28 mengembalikan satu nilai, bukan larik yang berisi satu item. Ini lebih penting daripada kelihatannya, dan saya akan kembali ke contoh

3_28 dalam Latihan

Katakanlah Anda ingin mencari jumlah dari daftar angka. Menggunakan loop, akan terlihat seperti ini

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
67
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
69
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
71
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
73
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
75
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6________11______8________7______8
2
0__8

Meskipun ini bukan kasus penggunaan yang buruk untuk 

3
40, 
3
28 masih memungkinkan kita menghindari mutasi. Dengan
3
_28, kami akan menulis

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
82
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
84
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
86
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
88

Pertama, kami memanggil 

3
28 di daftar nomor kami. Kami meneruskannya sebagai callback, yang menerima nilai sebelumnya dan nilai saat ini sebagai argumen, dan menampilkan hasil penjumlahan keduanya. Karena kita meneruskan 
}[, thisArg]);
08 sebagai argumen kedua ke 
3
28, itu akan menggunakannya sebagai nilai 
}[, thisArg]);
10 pada iterasi pertama

Dengan fungsi panah, kami akan menulisnya seperti ini

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
90
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
92

Jika kita mengambil langkah demi langkah, terlihat seperti ini

Iteration PreviousCurrentTotal10112123333646410510515

Jika Anda bukan penggemar tabel, jalankan cuplikan ini di konsol

1
let newArray = arr.map(callback(currentValue[, index[, array]]) {
94________8___
let newArray = arr.map(callback(currentValue[, index[, array]]) {
96
3
let newArray = arr.map(callback(currentValue[, index[, array]]) {
98
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
2
00
let newArray = arr.map(callback(currentValue[, index[, array]]) {
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________ges

Untuk rekap.

3
28 mengulangi semua elemen array, menggabungkannya dengan cara apa pun yang Anda tentukan dalam panggilan balik Anda. Pada setiap iterasi, callback Anda memiliki akses ke nilai sebelumnya, yang merupakan nilai total sejauh ini, atau akumulasi;

Mari kembali ke contoh tugas kita. Kami mendapatkan daftar nama tugas dari 

3
26, dan daftar tugas yang difilter yang membutuhkan waktu lama. baik, 
3
_27.  

Bagaimana jika kita ingin mengetahui jumlah total waktu yang kita habiskan untuk bekerja hari ini?

Menggunakan loop 

3
_40, Anda akan menulis

1
2
14
2
let newArray = arr.map(callback(currentValue[, index[, array]]) {
71
3
}[, thisArg]);
4
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
2
20
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
2
22
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
2
24
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
}[, thisArg]);
8
2
0
  // return element for newArray, after executing something

9
2
2
2
30
2
4
  // return element for newArray, after executing something

9
2
6
2
34

Dengan

3
_28, itu menjadi

1
2
36
2
2
38

Itu hampir semua yang ada untuk itu. Hampir, karena JavaScript memberi kita satu lagi metode yang kurang dikenal, yang disebut 

}[, thisArg]);
16. Pada contoh di atas, 
3
28 dimulai dari item pertama dalam larik, berulang dari kiri ke kanan

1
2
40
2
2
42
3
2
44
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
}[, thisArg]);
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
2
48
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
2
50

}[, thisArg]);
_16 melakukan hal yang sama, tetapi berlawanan arah

1
2
40
2
2
54
3
2
44
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
}[, thisArg]);
8
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
  // return element for newArray, after executing something

9
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
2
62

Saya menggunakan 

3
_28 setiap hari, tetapi saya tidak pernah membutuhkan 
}[, thisArg]);
16. Saya rasa Anda mungkin juga tidak akan melakukannya. Tetapi jika Anda pernah melakukannya, sekarang Anda tahu itu ada

Gotcha

Tiga gotcha besar dengan 

3
_28 adalah

  1. lupa untuk
    3
    _46
  2. melupakan nilai awal
  3. mengharapkan array ketika
    3
    _28 mengembalikan nilai tunggal

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 agak aneh. Jika 

3
_28 hanya mengembalikan satu nilai, mengapa Anda mengharapkan array?

Ada beberapa alasan bagus untuk itu. Pertama,

3
_28 selalu menampilkan nilai tunggal, tidak selalu angka tunggal. Jika Anda mengurangi larik larik, misalnya, ia akan mengembalikan larik tunggal. Jika Anda terbiasa mengurangi larik, akan adil untuk berharap bahwa larik yang berisi satu item tidak akan menjadi kasus khusus

Kedua, jika 

3
28 mengembalikan array dengan nilai tunggal, secara alami akan cocok dengan 
3
26 dan 
3
27, dan fungsi lain pada array yang kemungkinan besar akan Anda gunakan dengannya.  

Penerapan

Saatnya untuk penampilan terakhir kita di bawah tenda. Seperti biasa, Mozilla memiliki polyfill antipeluru untuk dikurangi jika Anda ingin memeriksanya

1
2
64
2
2
66________00_______
2
68
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
2
70
let newArray = arr.map(callback(currentValue[, index[, array]]) {
____________________________________________________________________________________________________________________________________________________________________

Dua hal yang perlu diperhatikan di sini

  1. Kali ini, saya menggunakan nama 
    }[, thisArg]);
    
    _29 alih-alih 
    }[, thisArg]);
    
    10. Inilah yang biasanya Anda lihat di alam liar
  2. Saya menetapkan
    }[, thisArg]);
    
    _29 nilai awal jika pengguna memberikannya, dan default ke
    }[, thisArg]);
    
    08 jika tidak. Beginilah perilaku
    3
    _28 yang sebenarnya

Menyatukannya. Memetakan, Memfilter, Mengurangi, dan Kemampuan Berantai

Pada titik ini, Anda mungkin tidak begitu terkesan. Cukup adil.

3
26,
3
27, dan
3
28, dengan sendirinya, tidak terlalu menarik. Lagi pula, kekuatan mereka yang sebenarnya terletak pada kemampuan rantainya.  

Katakanlah saya ingin melakukan hal berikut

  1. Kumpulkan tugas selama dua hari
  2. Ubah durasi tugas menjadi jam, bukan menit
  3. Filter semua yang memakan waktu dua jam atau lebih
  4. Jumlahkan semuanya
  5. Kalikan hasilnya dengan tarif per jam untuk penagihan
  6. Keluarkan jumlah dolar yang diformat

Pertama, mari kita tentukan tugas kita untuk hari Senin dan Selasa

1
2
82
2
2
84
3
2
86
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
2
88
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
2
90
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
2
84
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
2
94
2
0
2
96
2
2
2
98
2
4
  // return element for newArray, after executing something

00
2
6
  // return element for newArray, after executing something

9
2
8
  // return element for newArray, after executing something

04
  // return element for newArray, after executing something

0
2
84
  // return element for newArray, after executing something

2
  // return element for newArray, after executing something

08
  // return element for newArray, after executing something

4
  // return element for newArray, after executing something

10
  // return element for newArray, after executing something

11
2
90
  // return element for newArray, after executing something

13
2
84
  // return element for newArray, after executing something

15
  // return element for newArray, after executing something

16
  // return element for newArray, after executing something

17
2
88
  // return element for newArray, after executing something

19
2
90
  // return element for newArray, after executing something

21
2
84
  // return element for newArray, after executing something

23
  // return element for newArray, after executing something

24
  // return element for newArray, after executing something

25
  // return element for newArray, after executing something

26
  // return element for newArray, after executing something

27
2
98
  // return element for newArray, after executing something

29
  // return element for newArray, after executing something

00
  // return element for newArray, after executing something

31
  // return element for newArray, after executing something

32
  // return element for newArray, after executing something

33
  // return element for newArray, after executing something

34

Dan sekarang, transformasi kami yang terlihat cantik

1
  // return element for newArray, after executing something

36
2
  // return element for newArray, after executing something

38
3
  // return element for newArray, after executing something

40
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
  // return element for newArray, after executing something

42
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
  // return element for newArray, after executing something

44
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
  // return element for newArray, after executing something

46
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
  // return element for newArray, after executing something

48
2
0
  // return element for newArray, after executing something

50
2
2
  // return element for newArray, after executing something

52
2
4
  // return element for newArray, after executing something

54
2
6
  // return element for newArray, after executing something

56
2
8
  // return element for newArray, after executing something

58
  // return element for newArray, after executing something

0
  // return element for newArray, after executing something

60
  // return element for newArray, after executing something

2
  // return element for newArray, after executing something

62
  // return element for newArray, after executing something

4
  // return element for newArray, after executing something

64
  // return element for newArray, after executing something

11
  // return element for newArray, after executing something

66

Jika Anda sudah sampai sejauh ini, ini seharusnya cukup mudah. Namun, ada dua keanehan untuk dijelaskan.  

Pertama, di baris 10, saya harus menulis

1
  // return element for newArray, after executing something

68
2
  // return element for newArray, after executing something

70
3
  // return element for newArray, after executing something

72
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
  // return element for newArray, after executing something

74

Dua hal untuk dijelaskan di sini

  1. Tanda tambah di depan
    }[, thisArg]);
    
    _29 dan
    }[, thisArg]);
    
    38 memaksa nilainya menjadi angka. Jika Anda tidak melakukan ini, nilai kembalian akan berupa string yang agak tidak berguna, 
    }[, thisArg]);
    
    39
  2. Jika Anda tidak menggabungkan jumlah itu dalam tanda kurung, 
    3
    28 akan mengeluarkan satu nilai, bukan array. Itu akan menghasilkan
    }[, thisArg]);
    
    _41, karena Anda hanya dapat menggunakan
    3
    26 pada array.  

Bagian kedua yang mungkin membuat Anda sedikit tidak nyaman adalah

3
28 terakhir, yaitu

1
  // return element for newArray, after executing something

68
2
  // return element for newArray, after executing something

78
3
  // return element for newArray, after executing something

80
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
  // return element for newArray, after executing something

82
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
  // return element for newArray, after executing something

84
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
}[, thisArg]);
8

Panggilan ke 

3
_26 mengembalikan larik yang berisi satu nilai. Di sini, kami memanggil 
3
28 untuk menarik nilai tersebut

Terakhir, mari kita lihat bagaimana teman kita 

3
40 loop akan menyelesaikannya

1
  // return element for newArray, after executing something

88
2
  // return element for newArray, after executing something

90
3
  // return element for newArray, after executing something

92
let newArray = arr.map(callback(currentValue[, index[, array]]) {
2
  // return element for newArray, after executing something

94
let newArray = arr.map(callback(currentValue[, index[, array]]) {
4
2
48
let newArray = arr.map(callback(currentValue[, index[, array]]) {
6
  // return element for newArray, after executing something

98
let newArray = arr.map(callback(currentValue[, index[, array]]) {
8
3
00
2
0
let newArray = arr.map(callback(currentValue[, index[, array]]) {
71
2
2
3
04
2
4
3
06
2
6
let newArray = arr.map(callback(currentValue[, index[, array]]) {
19
2
8
}[, thisArg]);
8
  // return element for newArray, after executing something

0
2
48
  // return element for newArray, after executing something

2
3
14
  // return element for newArray, after executing something

4
3
16
  // return element for newArray, after executing something

11
}[, thisArg]);
8
  // return element for newArray, after executing something

13
  // return element for newArray, after executing something

15
  // return element for newArray, after executing something

17
  // return element for newArray, after executing something

19
3
23
  // return element for newArray, after executing something

21
  // return element for newArray, after executing something

9

Bisa ditoleransi, tapi berisik

Kesimpulan dan Langkah Selanjutnya

Dalam tutorial ini, Anda telah mempelajari cara kerja 

3
26, 
3
27, dan 
3
28; . Anda telah melihat bahwa mereka semua memungkinkan Anda untuk menghindari keadaan bermutasi, yang menggunakan 
3
39 dan 
3
40 loop memerlukan, dan Anda sekarang harus memiliki ide yang baik tentang cara merangkai semuanya.  

Sekarang, saya yakin Anda bersemangat untuk berlatih dan membaca lebih lanjut. Untuk masterclass dalam pemrograman fungsional dalam JavaScript, lihat kursus online kami

Bisakah kita menggunakan filter dan peta bersama dalam JavaScript?

Fungsi Array#map() dan Array#filter() JavaScript sangat bagus jika digunakan bersama karena memungkinkan Anda membuat fungsi sederhana. Misalnya, inilah kasus penggunaan dasar untuk filter(). memfilter semua angka yang kurang dari 100 dari array numerik. Fungsi ini bekerja dengan baik pada array angka.

Bagaimana cara menggunakan filter dan temukan bersama dalam JavaScript?

filter() mengembalikan larik yang berisi elemen yang memenuhi syarat, tetapi find() mengembalikan elemen itu sendiri yang memenuhi syarat . Dalam filter() , seluruh larik diulang meskipun elemen yang dicari ada di awal.

Apa perbedaan antara peta () dan filter ()?

Peta(). Lakukan operasi yang sama pada semua elemen dalam iterable. Contohnya adalah melakukan transformasi log pada setiap elemen. Saring(). Memfilter subkumpulan elemen yang memenuhi kondisi (kumpulan) tertentu. Contohnya adalah memfilter kalimat yang mengandung string tertentu

Apa itu filter () peta () dan kurangi ()?

Fungsi map(), filter(), dan reduce() semuanya melakukan hal yang sama. Mereka masing-masing mengambil fungsi dan daftar elemen, lalu mengembalikan hasil penerapan fungsi ke setiap elemen dalam daftar . Seperti yang dinyatakan sebelumnya, Python memiliki fungsi bawaan seperti map(), filter(), dan reduce().