Pelanggan Siti menanyakan dua hal yang serupa tetapi berbeda bentuk: “adakah balpen di bawah sepuluh ribu?” — minta satu barang konkretnya — dan “apakah semua produk sudah berlabel harga?” — minta kesimpulan benar-salah. map, filter, dan reduce dari chapter sebelumnya memproses seluruh daftar; pertanyaan seperti ini tidak butuh seluruh daftar, melainkan satu kecocokan atau satu kesimpulan.
includes yang sudah kita kenal tidak cukup untuk pertanyaan semacam ini, karena ia hanya membandingkan nilai persis — tidak bisa menguji “harga di bawah 10000”. Chapter ini membahas find, findIndex, some, dan every, keempatnya menerima callback sebagai uji dan menjawab pertanyaan yang lebih luas.
find: Elemen Pertama yang Lolos Uji #
Aturan find: telusuri array dari depan, panggil callback untuk tiap elemen, dan berhenti pada elemen pertama yang membuat callback bernilai benar. Elemen itu dikembalikan apa adanya; bila tidak ada satu pun yang lolos, hasilnya undefined.
const stok = [12, 0, 7, 3];
console.log(stok.find((n) => n < 5));
console.log(stok.find((n) => n > 100));Output yang Dihasilkan:
0
undefinedKeluaran pertama mungkin mengejutkan: bukan 3, melainkan 0. Callback n < 5 diperiksa berurutan — 12 gagal, 0 lolos — dan find langsung berhenti tanpa memeriksa 7 dan 3 yang juga lolos uji. Keluaran kedua menunjukkan sisi sebaliknya: tidak ada elemen di atas 100, sehingga hasilnya undefined, bukan error. Pola “berhenti di kecocokan pertama” membuat find efisien pada daftar panjang.
Satu hal lagi yang perlu diantisipasi: bila elemen yang ditemukan berupa object — seperti pada berkas utama nanti — yang dikembalikan adalah object itu sendiri, bukan salinannya. Perubahan atas hasil find dengan demikian berlaku pada data di dalam array. Perilaku ini akan terasa wajar setelah konsep referensi dibedakan di section Objects; untuk sekarang, cukup diingat bahwa find tidak menduplikasi hasilnya.
findIndex: Posisinya, Bukan Elemennya #
findIndex bekerja sama persis dengan find, tetapi yang dikembalikan adalah index kecocokan pertama, atau -1 bila tidak ada — mirip relasi indexOf dan includes. Kembalian ini berguna ketika posisi dibutuhkan untuk operasi lanjutan seperti splice:
const stokGudang = [12, 0, 7, 3];
const posisiNol = stokGudang.findIndex((n) => n === 0);
console.log(posisiNol);Output yang Dihasilkan:
1Nilai 0 berada di index 1, dan itulah yang dikembalikan — bukan nilainya. Pemisahan “nilai” dan “posisi” antara find dan findIndex memungkinkan kita memilih kembalian yang memang dibutuhkan.
some dan every: Pemeriksaan Sebagian dan Keseluruhan #
Kedua method mengembalikan boolean. some menjawab “adakah minimal satu elemen yang lolos uji?”, sedangkan every menjawab “apakah semua elemen lolos uji?”. Keduanya juga berhenti lebih awal: some berhenti begitu menemukan satu kecocokan, every berhenti begitu menemukan satu pengecualian.
const stokGudang = [12, 0, 7, 3];
console.log(stokGudang.some((n) => n === 0));
console.log(stokGudang.every((n) => n >= 0));
console.log(stokGudang.every((n) => n > 0));Output yang Dihasilkan:
true
true
falseBaris pertama: ada satu elemen 0, jadi some menjawab true. Baris kedua: semua elemen >= 0, jadi every menjawab true. Baris ketiga menunjukkan kegagalan every: elemen 0 membuat uji n > 0 batal di tengah jalan, dan jawabannya false tanpa memeriksa sisa elemen. Perhatikan beda tipis ujinya — >= versus > — yang menentukan hasil keseluruhan.
Array Kosong: Jawaban yang Sudah Ditentukan #
Pertanyaan “adakah” dan “apakah semua” tetap harus dijawab bahkan ketika array tidak berisi apa pun. Aturannya tetap berjalan, dan hasilnya mungkin mengejutkan:
console.log([].some(() => true));
console.log([].every(() => false));Output yang Dihasilkan:
false
truesome menjawab false karena tidak ada satu pun elemen yang lolos — untuk menghasilkan true, minimal satu elemen memang diperlukan. every justru menjawab true meskipun ujinya sengaja false: tidak ada elemen yang berhasil ditolak, karena tidak ada elemen yang diperiksa. Perlakukan hasil ini sebagai konsekuensi logis, bukan keanehan — pernyataan “semua item di keranjang sudah dibayar” tidak bisa dibantah ketika keranjangnya kosong, karena tidak ada satu pun item yang melanggar. Kesadaran ini penting karena every yang menjawab true atas array kosong bisa membuat jalur program berjalan padahal datanya belum ada.
includes vs find: Memilih Alat Pencarian #
Kini kita punya banyak alat pemeriksaan, dan pilihannya ditentukan oleh dua pertanyaan: apakah ujinya nilai persis atau kondisi bebas, dan apakah yang dibutuhkan elemen, posisinya, atau kesimpulan benar-salah.
| Method | Uji yang dipakai | Mengembalikan |
|---|---|---|
includes | nilai persis (===) | true / false |
indexOf | nilai persis (===) | index pertama, atau -1 |
find | callback kondisi | elemen pertama yang lolos, atau undefined |
findIndex | callback kondisi | index pertama yang lolos, atau -1 |
some | callback kondisi | true bila minimal satu lolos |
every | callback kondisi | true bila semua lolos |
Baris atas dipakai untuk kecocokan nilai persis — "atk", 25000 — sedangkan baris bawah untuk kondisi apa pun yang bisa diekspresikan sebagai function. Dua bentuk berikut menghasilkan jawaban yang sama, tetapi fleksibilitasnya berbeda: daftarKategori.includes("atk") memeriksa nilai persis, sedangkan produk.some((item) => item.kategori === "atk") memeriksa properti tiap object. Bila suatu hari kriteria berubah menjadi “kategori atk dan harga di bawah 20000”, bentuk some tinggal menambah syarat, sedangkan bentuk includes harus diganti total. Ketika kriteria diperkirakan berkembang, mulailah dari method ber-callback. Berkas berikut menggabungkan seluruh method chapter ini pada dataset produk:
// find-some-every.js
// Mencari dan memeriksa: find, findIndex, some, every, dan includes.
const produk = [
{ nama: "Kabel USB", harga: 25000, kategori: "elektronik" },
{ nama: "Buku Catatan", harga: 15000, kategori: "atk" },
{ nama: "Mouse", harga: 60000, kategori: "elektronik" },
{ nama: "Pulpen", harga: 8000, kategori: "atk" },
];
// --- 1. find: elemen pertama yang lolos uji ---
const barangMurah = produk.find((item) => item.harga < 10000);
console.log(barangMurah);
const barangMahal = produk.find((item) => item.harga > 1000000);
console.log(barangMahal);
// --- 2. findIndex: posisi elemen pertama yang lolos uji ---
const posisi = produk.findIndex((item) => item.kategori === "atk");
console.log(posisi);
console.log(produk[posisi].nama);
// --- 3. some: cukup satu elemen yang lolos ---
const adaBarangMahal = produk.some((item) => item.harga > 50000);
console.log(adaBarangMahal);
// --- 4. every: semua elemen harus lolos ---
const semuaTerjangkau = produk.every((item) => item.harga < 50000);
console.log(semuaTerjangkau);
// --- 5. includes: membandingkan nilai langsung, tanpa callback ---
const daftarKategori = ["elektronik", "atk", "pakaian"];
console.log(daftarKategori.includes("atk"));
console.log(daftarKategori.includes("ATK"));Output yang Dihasilkan:
{ nama: 'Pulpen', harga: 8000, kategori: 'atk' }
undefined
1
Buku Catatan
true
false
true
falseMari kita telaah baris-baris pentingnya:
- Baris 12 (
produk.find((item) => item.harga < 10000)): callback menguji harga tiap produk;Pulpendengan harga8000adalah kecocokan pertama, danfindmengembalikan object utuhnya — bukan array. - Baris 15 (
produk.find((item) => item.harga > 1000000)): tidak ada produk dengan harga segitu, sehingga hasilnyaundefined. - Baris 19–21 (
findIndexlaluproduk[posisi].nama): kategori"atk"pertama ditemukan di index1, dan index itu dipakai untuk membaca nama produknya,"Buku Catatan". - Baris 24 (
produk.some((item) => item.harga > 50000)):Mouseberharga60000melewati batas, sehinggasomemenjawabtruedan berhenti lebih awal. - Baris 28 (
produk.every((item) => item.harga < 50000)):Mouselagi-lagi menjadi pengecualian —60000tidak kurang dari50000— sehinggaeverymenjawabfalse. - Baris 33–34 (
includes("atk")danincludes("ATK")): nilai persis ditemukan (true), tetapi perbedaan huruf besar-kecil membuat"ATK"tidak cocok dengan"atk"(false). Pencarianincludesselalu peka huruf.
Sekarang kita bisa mencari, memeriksa, dan mengubah data array. Satu kebutuhan terakhir yang sama pentingnya: menata urutan — termurah dulu, atau abjad — topik chapter Sorting dan Reversing.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
find-some-every.js
Unduh berkas// find-some-every.js
// Mencari dan memeriksa: find, findIndex, some, every, dan includes.
const produk = [
{ nama: "Kabel USB", harga: 25000, kategori: "elektronik" },
{ nama: "Buku Catatan", harga: 15000, kategori: "atk" },
{ nama: "Mouse", harga: 60000, kategori: "elektronik" },
{ nama: "Pulpen", harga: 8000, kategori: "atk" },
];
// --- 1. find: elemen pertama yang lolos uji ---
const barangMurah = produk.find((item) => item.harga < 10000);
console.log(barangMurah);
const barangMahal = produk.find((item) => item.harga > 1000000);
console.log(barangMahal);
// --- 2. findIndex: posisi elemen pertama yang lolos uji ---
const posisi = produk.findIndex((item) => item.kategori === "atk");
console.log(posisi);
console.log(produk[posisi].nama);
// --- 3. some: cukup satu elemen yang lolos ---
const adaBarangMahal = produk.some((item) => item.harga > 50000);
console.log(adaBarangMahal);
// --- 4. every: semua elemen harus lolos ---
const semuaTerjangkau = produk.every((item) => item.harga < 50000);
console.log(semuaTerjangkau);
// --- 5. includes: membandingkan nilai langsung, tanpa callback ---
const daftarKategori = ["elektronik", "atk", "pakaian"];
console.log(daftarKategori.includes("atk"));
console.log(daftarKategori.includes("ATK"));