Penulis materi, terjemahan yang kami terbitkan hari ini, mengatakan bahwa dalam beberapa bulan terakhir, ketika memeriksa permintaan tarik, ia terus-menerus menemukan empat kekurangan yang sama terkait dengan penggunaan metode array yang tidak rasional dalam JavaScript. Untuk mengurangi kekurangan kode yang sebelumnya muncul di programnya, dia menulis artikel ini.

Mengganti indexOf () dengan include ()
"Jika Anda mencari sesuatu dalam array, gunakan metode
indexOf()
." Saya bertemu dengan rekomendasi seperti itu di salah satu kursus ketika saya belajar JavaScript. Rekomendasi ini cukup normal, tidak ada hal buruk yang bisa dikatakan tentang itu.
Pada MDN, Anda bisa mengetahui bahwa metode
indexOf()
mengembalikan indeks pertama di mana elemen tertentu dapat ditemukan dalam array. Ini berarti bahwa jika kami berencana untuk menggunakan indeks ini dalam program, metode
indexof()
sangat bagus untuk menemukan elemen dalam array.
Tetapi bagaimana jika kita hanya perlu mencari tahu apakah ada elemen tertentu dalam array atau tidak? Artinya, kami tertarik bukan pada indeks elemen ini, jika itu dalam array, tetapi fakta ada atau tidaknya. Dengan pendekatan ini, kami cukup nyaman dengan perintah yang mengembalikan
true
atau
false
. Dalam kasus seperti itu, saya sarankan tidak menggunakan metode
indexOf()
, tetapi metode
includes()
, yang mengembalikan nilai boolean. Pertimbangkan sebuah contoh:
'use strict'; const characters = [ 'ironman', 'black_widow', 'hulk', 'captain_america', 'hulk', 'thor', ]; console.log(characters.indexOf('hulk'));
Menggunakan metode find () alih-alih metode filter ()
Metode
filter()
adalah alat yang sangat berguna. Itu, berdasarkan satu array, menciptakan array lain yang mengandung elemen-elemen dari array asli yang cocok dengan kondisi yang ditentukan. Seperti yang Anda lihat dari nama metode ini, ia dirancang untuk memfilter array, di mana array biasanya diperoleh yang lebih pendek dari yang asli.
Bagaimana jika kita tahu bahwa setelah memfilter array, hanya satu elemen yang akan tersisa? Misalnya, ini bisa terjadi ketika Anda mencoba memfilter elemen array berdasarkan beberapa pengidentifikasi unik. Dalam situasi seperti itu, saya tidak akan merekomendasikan menggunakan metode
filter()
, karena array yang terbentuk hanya berisi satu elemen. Jika kita tertarik pada elemen array dengan nilai unik, maka kita akan bekerja dengan nilai tunggal, dan array tidak diperlukan untuk mewakili nilai seperti itu.
Jika kita berbicara tentang kinerja metode
filter()
, ternyata untuk membentuk daftar elemen yang sesuai dengan kondisi yang ditentukan ketika dipanggil, ia harus melihat seluruh array. Selain itu, bayangkan bahwa ada ratusan elemen dalam array yang memenuhi kondisi tertentu. Ini akan menghasilkan array yang dihasilkan menjadi cukup besar.
Untuk menghindari situasi seperti itu, saya akan merekomendasikan menggunakan metode
find()
. Ketika dipanggil, ia menerima panggilan balik yang menggambarkan kondisi, sangat mirip dengan yang digunakan dengan metode
filter()
, tetapi metode
find()
mengembalikan hanya elemen pertama yang cocok dengan kondisi tersebut. Pada saat yang sama, metode ini berhenti bekerja segera setelah menemukan elemen seperti itu. Akibatnya, ia tidak harus melihat seluruh array.
'use strict'; const characters = [ { id: 1, name: 'ironman' }, { id: 2, name: 'black_widow' }, { id: 3, name: 'captain_america' }, { id: 4, name: 'captain_america' }, ]; function getCharacter(name) { return character => character.name === name; } console.log(characters.filter(getCharacter('captain_america'))); // [ // { id: 3, name: 'captain_america' }, // { id: 4, name: 'captain_america' }, // ] console.log(characters.find(getCharacter('captain_america'))); // { id: 3, name: 'captain_america' }
Mengganti metode find () dengan metode some ()
Harus saya akui, pengawasan yang akan kita bahas sekarang, sudah saya lakukan berkali-kali. Kemudian mereka menyarankan saya untuk melihat
MDN dan melihat bagaimana meningkatkan apa yang saya lakukan secara tidak rasional. Singkatnya, ini sangat mirip dengan apa yang baru saja kita lihat ketika berbicara tentang metode
indexOf()
dan
includes()
.
Dalam kasus di atas, kami melihat bahwa metode
find()
, sebagai argumen, mengambil panggilan balik dan mengembalikan elemen array. Bisakah metode
find()
disebut solusi paling sukses jika kita perlu mencari tahu apakah array mengandung nilai tertentu atau tidak? Mungkin tidak, karena metode ini mengembalikan nilai elemen array, bukan boolean.
Dalam situasi seperti itu, saya akan merekomendasikan menggunakan metode
some()
, yang mengembalikan nilai boolean.
'use strict'; const characters = [ { id: 1, name: 'ironman', env: 'marvel' }, { id: 2, name: 'black_widow', env: 'marvel' }, { id: 3, name: 'wonder_woman', env: 'dc_comics' }, ]; function hasCharacterFrom(env) { return character => character.env === env; } console.log(characters.find(hasCharacterFrom('marvel')));
Menggunakan metode pengurangan () alih-alih kombinasi metode filter () dan peta ()
Perlu dikatakan bahwa metode
reduce()
tidak dapat diklasifikasikan sebagai mudah dimengerti. Namun, jika apa yang dapat dilakukan dengan itu dilakukan dalam dua langkah, menggunakan metode
filter()
dan
map()
yang digabungkan dalam sebuah rantai, tampaknya ada sesuatu dalam pendekatan ini yang salah.
Saya mengatakan bahwa dengan pendekatan ini, Anda harus melihat array dua kali. Lulus pertama, yang dilakukan oleh metode
filter()
, melibatkan melihat seluruh array dan membuat array baru yang difilter. Setelah lintasan kedua, dilakukan oleh metode
map()
, sekali lagi, array baru dibuat yang berisi hasil transformasi elemen-elemen array yang diperoleh setelah metode
filter()
dijalankan. Akibatnya, untuk mencapai array yang selesai, dua metode digunakan. Setiap metode memiliki callback sendiri, dan selama pelaksanaan operasi seperti itu menggunakan metode
filter()
, sebuah array dibuat yang kita tidak bisa lagi bekerja dengan.
Untuk mengurangi beban pada sistem yang dibuat dengan menggunakan dua metode dan meningkatkan produktivitas program, dalam kasus seperti itu, saya akan merekomendasikan menggunakan metode
reduce()
. Hasilnya akan sama, tetapi kode akan menjadi lebih baik. Metode ini memungkinkan Anda untuk memfilter elemen yang menarik bagi kami dan menambahkannya ke baterai. Baterai dapat berupa variabel numerik yang menyimpan, katakanlah, jumlah elemen array, dapat berupa objek, string atau array di mana kita dapat mengakumulasikan elemen yang kita butuhkan.
Dalam kasus kami, karena kita berbicara tentang menggunakan metode
map()
, saya akan menyarankan menggunakan metode
reduce()
dengan array sebagai akumulator. Dalam contoh berikut, kami memfilter elemen array yang objek dengan nilai bidang
env
dan melakukan konversi.
'use strict'; const characters = [ { name: 'ironman', env: 'marvel' }, { name: 'black_widow', env: 'marvel' }, { name: 'wonder_woman', env: 'dc_comics' }, ]; console.log( characters .filter(character => character.env === 'marvel') .map(character => Object.assign({}, character, { alsoSeenIn: ['Avengers'] })) ); // [ // { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] }, // { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] } // ] console.log( characters .reduce((acc, character) => { return character.env === 'marvel' ? acc.concat(Object.assign({}, character, { alsoSeenIn: ['Avengers'] })) : acc; }, []) ) // [ // { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] }, // { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] } // ]
Ringkasan
Dalam artikel ini, kami menguji beberapa pendekatan untuk penggunaan metode array yang efektif dalam menyelesaikan berbagai masalah. Kami percaya bahwa ide-ide yang menjadi dasar rekomendasi yang diberikan oleh penulis artikel ini dapat membantu meningkatkan kode JS dalam situasi lain.
Pembaca yang budiman! Pernahkah Anda menemukan contoh kesalahan alokasi mekanisme JavaScript?
