Kami mempersembahkan kepada Anda terjemahan sebuah artikel oleh Thomas Lombart, yang diterbitkan di medium.freecodecamp.org. Terjemahan diterbitkan dengan izin dari penulis.
Contoh menggunakan metode pengurangan untuk mengurangi arrayBiarkan saya membuat pernyataan yang berani: loop sering tidak berguna dan membuat kode sulit dibaca. Untuk iterasi dalam array, pencarian, elemen penyortiran, dan tindakan serupa lainnya, Anda dapat menggunakan salah satu metode di bawah ini.
Meskipun efektif, sebagian besar metode ini masih sedikit diketahui dan tidak terlalu populer. Saya akan melakukan kerja keras untuk Anda dan berbicara tentang yang paling berguna. Baca artikel ini sebagai panduan Anda untuk metode array JavaScript.
Catatan : Sebelum kita mulai, Anda perlu tahu satu hal: Saya bias terhadap pemrograman fungsional. Untuk menghindari efek samping, saya berusaha menerapkan metode yang tidak secara langsung memodifikasi array asli. Saya tidak memberitahu Anda untuk menolak untuk mengubah array sama sekali, tetapi perlu mempertimbangkan bahwa beberapa metode mengarah ke ini. Akibatnya, efek samping, perubahan yang tidak diinginkan dan, sebagai akibatnya, bug muncul.
Artikel ini awalnya diterbitkan di
thomlom.dev , di mana Anda dapat menemukan lebih banyak materi pengembangan web.
Dasar-dasarnya
Ada empat metode yang perlu diketahui jika Anda bekerja dengan array. Ini adalah
map
,
filter
,
reduce
dan operator
spread
. Mereka efektif dan bermanfaat.
petaAnda akan sering menggunakan metode
map
. Secara umum, setiap kali Anda perlu mengubah elemen array, pertimbangkan opsi ini.
Dibutuhkan satu parameter - fungsi yang dipanggil pada setiap elemen array, dan kemudian mengembalikan
array baru sehingga tidak ada efek samping.
const numbers = [1, 2, 3, 4] const numbersPlusOne = numbers.map(n => n + 1) console.log(numbersPlusOne)
Anda juga dapat membuat array baru yang menyimpan hanya satu properti spesifik objek.
const allActivities = [ { title: 'My activity', coordinates: [50.123, 3.291] }, { title: 'Another activity', coordinates: [1.238, 4.292] } ] const allCoordinates = allActivities.map(activity => activity.coordinates) console.log(allCoordinates)
Jadi, ingat: ketika Anda perlu
mengubah array, pikirkan tentang menggunakan
peta .
filterNama metode ini berbicara sendiri: gunakan ketika Anda ingin memfilter array.
Seperti
map
,
filter
mengambil sebagai parameter tunggal fungsi yang dipanggil pada setiap elemen array. Fungsi ini harus mengembalikan nilai boolean:
true
- jika Anda ingin menyimpan elemen dalam array;false
- jika Anda tidak ingin menyimpannya.
Akibatnya, Anda akan memiliki array baru yang benar dengan elemen yang ingin Anda tinggalkan.
Misalnya, hanya angka ganjil yang dapat disimpan dalam array.
const numbers = [1, 2, 3, 4, 5, 6] const oddNumbers = numbers.filter(n => n % 2 !== 0) console.log(oddNumbers)
Anda juga bisa menggunakan filter untuk menghapus elemen tertentu dalam array.
const participants = [ { id: 'a3f47', username: 'john' }, { id: 'fek28', username: 'mary' }, { id: 'n3j44', username: 'sam' }, ] function removeParticipant(participants, id) { return participants.filter(participant => participant.id !== id) } console.log(removeParticipant(participants, 'a3f47'))
kurangiMenurut pendapat saya, metode ini adalah yang paling sulit dipahami. Tetapi begitu Anda menguasainya, Anda akan memiliki banyak peluang.
Biasanya, metode
reduce
mengambil array nilai dan menyatukannya menjadi nilai tunggal. Dibutuhkan dua parameter, fungsi callback (yang merupakan
peredam ) dan nilai awal opsional (yang merupakan elemen pertama dari array secara default). Gearbox itu sendiri mengambil empat parameter:
- baterai yang mengumpulkan nilai yang dikembalikan di gearbox ;
- nilai array saat ini;
- indeks saat ini;
- array yang disebut metode
reduce
.
Pada dasarnya Anda hanya akan menggunakan dua parameter pertama - baterai dan nilai saat ini.
Tapi mari kita tidak masuk jauh ke dalam teori dan mempertimbangkan contoh penerapan
reduce
paling umum.
const numbers = [37, 12, 28, 4, 9] const total = numbers.reduce((total, n) => total + n) console.log(total)
Dalam iterasi pertama, akumulator, yang merupakan jumlah, mengambil nilai awal 37. Nilai yang dikembalikan adalah 37 + n, di mana n = 12. Kita mendapatkan 49.
Selama iterasi kedua, akumulator adalah 49, nilai yang dikembalikan adalah 49 + 28 = 77. Dan seterusnya.
Metode
reduce
sangat fungsional sehingga Anda dapat menggunakannya untuk membangun banyak metode array seperti
map
atau
filter
.
const map = (arr, fn) => { return arr.reduce((mappedArr, element) => { return [...mappedArr, fn(element)] }, []) } console.log(map([1, 2, 3, 4], n => n + 1))
Sebagai aturan, kami menetapkan nilai awal
[]
ke metode pereduksi - akumulator. Untuk
map
kami menjalankan fungsi yang hasilnya ditambahkan ke ujung baterai menggunakan
operator spread (kami akan membicarakannya di bawah, jangan khawatir). Untuk
filter
melakukan hal yang hampir sama, kami hanya menjalankan fungsi filter pada elemen. Jika itu benar, kami mengembalikan array
sebelumnya . Jika tidak, tambahkan elemen ke akhir array.
Mari kita lihat contoh yang lebih kompleks: sangat mengurangi array
[1, 2, 3, [4, [[[5, [6, 7]]]], 8]]
menjadi
[1, 2, 3, 4, 5, 6, 7, 8]
.
function flatDeep(arr) { return arr.reduce((flattenArray, element) => { return Array.isArray(element) ? [...flattenArray, ...flatDeep(element)] : [...flattenArray, element] }, []) } console.log(flatDeep([1, 2, 3, [4, [[[5, [6, 7]]]], 8]]))
Contoh ini sangat mirip dengan
map
, kecuali bahwa kami menggunakan rekursi di sini. Saya tidak akan membahas rekursi secara terperinci, karena ini berada di luar cakupan topik kita, tetapi jika Anda ingin tahu lebih banyak, pergilah ke
sumber yang bagus ini.
Pernyataan Spread (ES2015)Saya setuju, ini bukan metode. Namun, operator spread membantu mencapai tujuan yang berbeda ketika bekerja dengan array. Anda dapat menerapkannya untuk memperluas nilai-nilai dari satu array di array lain, dan kemudian membuat salinan atau menghubungkan beberapa array secara bersamaan.
const numbers = [1, 2, 3] const numbersCopy = [...numbers] console.log(numbersCopy)
Catatan : pernyataan spread membuat
salinan dangkal dari array asli. Tapi apa artinya "dangkal"?
Salinan seperti itu akan menggandakan elemen asli sesedikit mungkin. Jika Anda memiliki larik dengan angka, string atau nilai boolean (
tipe primitif ), tidak ada masalah dan nilainya benar-benar diduplikasi. Namun, berbagai hal berbeda dengan
objek dan
array : hanya
referensi ke nilai asli yang disalin. Oleh karena itu, jika Anda membuat salinan dangkal dari array termasuk objek dan mengubah objek dalam array yang disalin, itu juga akan diubah dalam aslinya, karena mereka memiliki
referensi yang sama .
const arr = ['foo', 42, { name: 'Thomas' }] let copy = [...arr] copy[0] = 'bar' console.log(arr)
Jadi, jika Anda ingin membuat salinan nyata dari array yang berisi objek atau array, Anda bisa menggunakan fungsi
lodash seperti
cloneDeep . Namun jangan menganggap diri Anda wajib melakukan ini. Tujuan Anda adalah untuk
mengetahui cara kerja semuanya di bawah tenda .
Metode yang bermanfaat
Di bawah ini Anda akan menemukan metode lain yang juga berguna untuk diketahui dan yang dapat berguna untuk memecahkan masalah seperti menemukan elemen dalam array, menghapus bagian dari array, dan banyak lagi.
termasuk (ES2015)Apakah Anda pernah menggunakan
indexOf
untuk mengetahui apakah ada elemen dalam array atau tidak? Cara yang buruk untuk memeriksanya, bukan?
Untungnya, metode yang
includes
melakukan validasi untuk kami. Tetapkan parameter untuk menyertakan, dan itu akan mencari elemen dalam array.
const sports = ['football', 'archery', 'judo'] const hasFootball = sports.includes('football') console.log(hasFootball)
concatMetode concat dapat digunakan untuk menggabungkan dua atau lebih array.
const numbers = [1, 2, 3] const otherNumbers = [4, 5, 6] const numbersConcatenated = numbers.concat(otherNumbers) console.log(numbersConcatenated)
forEachJika Anda ingin melakukan tindakan untuk setiap elemen array, Anda bisa menggunakan metode
forEach
. Dibutuhkan fungsi sebagai parameter, yang pada gilirannya juga membutuhkan tiga parameter: nilai saat ini, indeks, dan array.
const numbers = [1, 2, 3, 4, 5] numbers.forEach(console.log)
indexOfMetode ini digunakan untuk mengembalikan indeks pertama di mana elemen dapat ditemukan dalam array. Juga,
indexOf
sering memeriksa keberadaan elemen dalam array. Jujur, sekarang saya jarang menggunakannya.
const sports = ['football', 'archery', 'judo'] const judoIndex = sports.indexOf('judo') console.log(judoIndex)
temukanMetode
find
mirip dengan
filter
. Anda harus menyediakannya dengan fungsi yang menguji setiap elemen array. Namun,
find
berhenti menguji item segera setelah menemukan item yang lulus tes. Ini
bukan filter
yang mengulang seluruh array terlepas dari keadaan.
const users = [ { id: 'af35', name: 'john' }, { id: '6gbe', name: 'mary' }, { id: '932j', name: 'gary' }, ] const user = users.find(user => user.id === '6gbe') console.log(user)
Jadi, gunakan metode
filter
ketika Anda ingin memfilter
seluruh array, dan metode
find
ketika Anda yakin bahwa Anda sedang mencari elemen
unik dalam array.
temukanIndexMetode ini hampir sama dengan
find
, tetapi mengembalikan indeks elemen pertama yang ditemukan alih-alih elemen itu sendiri.
const users = [ { id: 'af35', name: 'john' }, { id: '6gbe', name: 'mary' }, { id: '932j', name: 'gary' }, ] const user = users.findIndex(user => user.id === '6gbe') console.log(user)
Anda mungkin berpikir bahwa
findIndex
dan
indexOf
adalah hal yang sama. Tidak juga. Parameter pertama dari
indexOf
adalah nilai primitif (nilai Boolean, angka, string, nilai yang tidak ditentukan, atau karakter), sedangkan parameter pertama
findIndex
adalah fungsi callback.
Oleh karena itu, ketika Anda perlu menemukan indeks elemen dalam array nilai primitif, Anda bisa bekerja dengan
indexOf
. Jika Anda memiliki elemen yang lebih kompleks, seperti objek, gunakan
findIndex
.
mengirisSaat Anda perlu mengambil bagian dari array atau menyalin array, Anda bisa merujuk ke metode
slice
. Tapi hati-hati: seperti operator spread,
slice
mengembalikan
salinan dangkal .
const numbers = [1, 2, 3, 4, 5] const copy = numbers.slice()
Di awal artikel, saya menyebutkan bahwa loop seringkali tidak berguna. Mari saya tunjukkan bagaimana cara menyingkirkannya.
Misalkan Anda ingin mengembalikan sejumlah pesan obrolan dari API dan Anda hanya perlu melihatnya lima. Berikut adalah dua pendekatan: satu dengan loop, yang lain dengan metode
slice
.
beberapaJika Anda ingin memeriksa apakah
setidaknya satu elemen array lulus tes, Anda bisa menggunakan
some
. Seperti
map
,
filter
atau
find
,
some
metode menggunakan fungsi callback sebagai satu-satunya parameter, dan kemudian mengembalikan
true
jika setidaknya satu elemen melewati pemeriksaan, dan
false
jika tidak.
some
juga cocok untuk bekerja dengan izin.
const users = [ { id: 'fe34', permissions: ['read', 'write'], }, { id: 'a198', permissions: [], }, { id: '18aa', permissions: ['delete', 'read', 'write'], } ] const hasDeletePermission = users.some(user => user.permissions.includes('delete') ) console.log(hasDeletePermission)
setiapMetode ini mirip dengan
some
, kecuali memeriksa bahwa
setiap elemen (dan
bukan satu ) cocok dengan kondisi.
const users = [ { id: 'fe34', permissions: ['read', 'write'], }, { id: 'a198', permissions: [], }, { id: '18aa', permissions: ['delete', 'read', 'write'], } ] const hasAllReadPermission = users.every(user => user.permissions.includes('read') ) console.log(hasAllReadPermission)
flat (ES2019)Ini adalah metode yang benar-benar baru di dunia JavaScript. Biasanya
flat
membuat array baru, menghubungkan semua elemen array bersarang. Dibutuhkan satu parameter - angka yang menunjukkan seberapa banyak Anda ingin mengurangi dimensi array.
const numbers = [1, 2, [3, 4, [5, [6, 7]], [[[[8]]]]]] const numbersflattenOnce = numbers.flat() console.log(numbersflattenOnce)
flatMap (ES2019)Coba tebak apa yang dilakukan metode ini? Saya yakin Anda akan mengerti satu nama.
Pertama, ini menjalankan fungsi pemetaan untuk setiap elemen, dan kemudian menyusutkan array pada suatu waktu. Sesederhana itu!
const sentences = [ 'This is a sentence', 'This is another sentence', "I can't find any original phrases", ] const allWords = sentences.flatMap(sentence => sentence.split(' ')) console.log(allWords)
Dalam contoh ini, Anda memiliki banyak kalimat dalam array dan Anda ingin mendapatkan semua kata. Alih-alih menggunakan metode
map
dan membagi semua kalimat menjadi kata-kata dan kemudian memperpendek array, Anda dapat menggunakan
flatMap
.
Kemudian Anda dapat menghitung jumlah kata dengan fungsi
reduce
(ini tidak berlaku untuk
flatMap
, saya hanya ingin menunjukkan kepada Anda contoh lain dari menggunakan metode
reduce
).
const wordsCount = allWords.reduce((count, word) => { count[word] = count[word] ? count[word] + 1 : 1 return count }, {}) console.log(wordsCount)
Metode
flatMap
juga sering digunakan dalam pemrograman reaktif. Anda dapat melihat contohnya di
sini .
bergabunglahJika Anda perlu membuat string berdasarkan elemen array, metode
join
adalah yang Anda butuhkan. Ini memungkinkan Anda untuk membuat garis baru dengan menghubungkan semua elemen array, dipisahkan oleh pemisah yang disediakan.
Misalnya, menggunakan
join
Anda dapat menampilkan secara visual semua peserta dalam suatu kegiatan.
const participants = ['john', 'mary', 'gary'] const participantsFormatted = participants.join(', ') console.log(participantsFormatted)
Dan ini adalah contoh yang lebih realistis di mana Anda dapat memfilter peserta dan mendapatkan nama mereka.
const potentialParticipants = [ { id: 'k38i', name: 'john', age: 17 }, { id: 'baf3', name: 'mary', age: 13 }, { id: 'a111', name: 'gary', age: 24 }, { id: 'fx34', name: 'emma', age: 34 }, ] const participantsFormatted = potentialParticipants .filter(user => user.age > 18) .map(user => user.name) .join(', ') console.log(participantsFormatted)
dariIni adalah metode
statis yang membuat array baru dari objek seperti-array atau iterable, seperti string. Ini bisa berguna ketika Anda bekerja dengan model objek dokumen.
const nodes = document.querySelectorAll('.todo-item')
Apakah Anda melihat bahwa kami menggunakan jenis array alih-alih instance array? Itu sebabnya metode ini disebut statis.
Kemudian Anda bisa bersenang-senang dengan node, misalnya mendaftar pendengar acara untuk masing-masing menggunakan metode
forEach
.
todoItems.forEach(item => { item.addEventListener('click', function() { alert(`You clicked on ${item.innerHTML}`) }) })
Modifikasi Array Layak Diketahui
Berikut ini adalah metode standar lainnya. Perbedaannya adalah mereka memodifikasi array asli. Tidak ada yang salah dengan perubahan, tetapi Anda harus mempertimbangkan ini saat bekerja.
Jika Anda tidak ingin memodifikasi larik asli saat bekerja dengan metode ini, buat permukaan atau salinan lengkap di muka.
const arr = [1, 2, 3, 4, 5] const copy = [...arr]
semacamYa,
sort
memodifikasi array asli. Bahkan, ia mengurutkan elemen-elemen array di tempatnya. Metode pemilahan default mengubah semua elemen menjadi string dan mengurutkannya dalam urutan abjad.
const names = ['john', 'mary', 'gary', 'anna'] names.sort() console.log(names)
Hati-hati: jika Anda, misalnya, beralih dari bahasa Python, maka metode
sort
saat bekerja dengan array angka tidak akan memberi Anda hasil yang diinginkan.
const numbers = [23, 12, 17, 187, 3, 90] numbers.sort() console.log(numbers)
Lalu bagaimana cara mengurutkan array? Metode
sort
mengambil satu fungsi -
fungsi perbandingan . Dibutuhkan dua parameter: elemen pertama (
) dan elemen kedua untuk perbandingan (
b
). Perbandingan antara kedua elemen ini membutuhkan digit untuk dikembalikan:
- jika nilainya negatif -
a
diurutkan sebelum b
; - jika nilainya positif,
b
diurutkan sebelum a
; - jika nilainya 0, tidak ada perubahan.
Lalu Anda bisa mengurutkan angka.
const numbers = [23, 12, 17, 187, 3, 90] numbers.sort((a, b) => a - b) console.log(numbers)
Atau Anda dapat mengurutkan tanggal dari yang terbaru.
const posts = [ { title: 'Create a Discord bot under 15 minutes', date: new Date(2018, 11, 26), }, { title: 'How to get better at writing CSS', date: new Date(2018, 06, 17) }, { title: 'JavaScript arrays', date: new Date() }, ] posts.sort((a, b) => a.date - b.date)
isiMetode
fill
memodifikasi atau mengisi semua elemen array dari indeks awal hingga akhir dengan nilai yang ditentukan. Contoh penggunaan
fill
sangat baik adalah mengisi array baru dengan data awal.
mundurMenurut saya, nama metode sepenuhnya menjelaskan esensinya.
const numbers = [1, 2, 3, 4, 5] numbers.reverse() console.log(numbers)
popMetode ini menghapus elemen terakhir dari array dan mengembalikannya.
const messages = ['Hello', 'Hey', 'How are you?', "I'm fine"] const lastMessage = messages.pop() console.log(messages)
Metode yang bisa diganti
Di bagian terakhir, Anda akan menemukan metode yang mengubah array asli dan yang mudah ditemukan sebagai alternatif. Saya tidak mengatakan bahwa mereka perlu didiskon, saya hanya ingin menyampaikan kepada Anda bahwa beberapa metode memiliki efek samping dan dapat diganti.
mendorongMetode ini sering digunakan. Ini memungkinkan Anda untuk menambahkan satu atau lebih elemen ke array, serta membangun array baru berdasarkan yang sebelumnya.
const todoItems = [1, 2, 3, 4, 5] const itemsIncremented = [] for (let i = 0; i < items.length; i++) { itemsIncremented.push(items[i] + 1) } console.log(itemsIncremented)
Jika Anda perlu membuat array berdasarkan yang lain, seperti dalam metode
itemsIncremented
, ada
map
sesuai,
filter
atau
reduce
itemsIncremented
yang sudah biasa bagi kami. Sebagai contoh, kita dapat mengambil
map
untuk melakukan ini.
const itemsIncremented = todoItems.map(x => x + 1)
Dan jika Anda ingin menggunakan
push
ketika Anda perlu menambahkan elemen baru, maka operator spread berguna.
const todos = ['Write an article', 'Proofreading'] console.log([...todos, 'Publish the article'])
sambatansplice
sering diakses untuk membersihkan elemen pada indeks tertentu. Anda dapat melakukan hal yang sama dengan metode
filter
.
const months = ['January', 'February', 'March', 'April', ' May']
Anda mungkin bertanya: bagaimana jika saya harus menghapus banyak elemen? Kemudian gunakan
slice
.
const months = ['January', 'February', 'March', 'April', ' May']
bergeserMetode
shift
menghapus elemen pertama dari array dan mengembalikannya. Untuk melakukan ini dalam gaya pemrograman fungsional, Anda dapat menggunakan pernyataan spread atau rest.
const numbers = [1, 2, 3, 4, 5]
tidak tergoyahkanMetode unshift memungkinkan Anda untuk menambahkan satu atau lebih elemen ke awal array. Seperti
shift
, Anda dapat melakukan ini dengan operator spread.
const numbers = [3, 4, 5]
TL; DR
- Ketika Anda ingin melakukan beberapa operasi dengan array, jangan gunakan loop for dan jangan menemukan kembali roda, karena kemungkinan besar ada metode dari atas yang dapat melakukan apa yang Anda butuhkan.
- Paling sering Anda akan menggunakan
map
, filter
, reduce
metode dan operator penyebaran - ini adalah alat penting untuk pengembang apa pun. - Ada juga banyak metode array yang menyenangkan untuk diketahui:
slice
, some
, flatMap
, dll. Kenali mereka dan terapkan jika perlu. - Efek samping dapat menyebabkan perubahan yang tidak diinginkan. Ingatlah bahwa beberapa metode memodifikasi array asli Anda.
- Metode
slice
dan operator spread membuat salinan dangkal. Akibatnya, objek dan subarrays akan memiliki tautan yang sama - ini juga perlu diingat. - Metode lama yang mengubah array dapat diganti dengan yang baru. Anda memutuskan apa yang harus dilakukan.
Sekarang Anda tahu semua yang harus Anda ketahui tentang array JavaScript. Jika Anda menyukai
artikel ini , klik tombol "Pat" (hingga 50 kali, jika Anda mau :-)) dan bagikan. Dan jangan ragu untuk membagikan kesan Anda di komentar!