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.

js
const stok = [12, 0, 7, 3];
console.log(stok.find((n) => n < 5));
console.log(stok.find((n) => n > 100));

Output yang Dihasilkan:

text
0
undefined

Keluaran 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:

js
const stokGudang = [12, 0, 7, 3];
const posisiNol = stokGudang.findIndex((n) => n === 0);
console.log(posisiNol);

Output yang Dihasilkan:

text
1

Nilai 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.

js
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:

text
true
true
false

Baris 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:

js
console.log([].some(() => true));
console.log([].every(() => false));

Output yang Dihasilkan:

text
false
true

some 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.

MethodUji yang dipakaiMengembalikan
includesnilai persis (===)true / false
indexOfnilai persis (===)index pertama, atau -1
findcallback kondisielemen pertama yang lolos, atau undefined
findIndexcallback kondisiindex pertama yang lolos, atau -1
somecallback kondisitrue bila minimal satu lolos
everycallback kondisitrue 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:

text
{ nama: 'Pulpen', harga: 8000, kategori: 'atk' }
undefined
1
Buku Catatan
true
false
true
false

Mari kita telaah baris-baris pentingnya:

  1. Baris 12 (produk.find((item) => item.harga < 10000)): callback menguji harga tiap produk; Pulpen dengan harga 8000 adalah kecocokan pertama, dan find mengembalikan object utuhnya — bukan array.
  2. Baris 15 (produk.find((item) => item.harga > 1000000)): tidak ada produk dengan harga segitu, sehingga hasilnya undefined.
  3. Baris 19–21 (findIndex lalu produk[posisi].nama): kategori "atk" pertama ditemukan di index 1, dan index itu dipakai untuk membaca nama produknya, "Buku Catatan".
  4. Baris 24 (produk.some((item) => item.harga > 50000)): Mouse berharga 60000 melewati batas, sehingga some menjawab true dan berhenti lebih awal.
  5. Baris 28 (produk.every((item) => item.harga < 50000)): Mouse lagi-lagi menjadi pengecualian — 60000 tidak kurang dari 50000 — sehingga every menjawab false.
  6. Baris 33–34 (includes("atk") dan includes("ATK")): nilai persis ditemukan (true), tetapi perbedaan huruf besar-kecil membuat "ATK" tidak cocok dengan "atk" (false). Pencarian includes selalu 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
javascript
// 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"));