JavaScript

Belum masuk. Progresmu tidak tersimpan.

Masuk
  • Bab 5 dari 12
  • 35 menit
  • 1 latihan kode
  • 4 soal kuis

Array dan Object

Di bab ini (10 bagian)
  1. Tujuan
  2. Array: daftar yang berurutan
  3. Menambah dan menghapus elemen
  4. slice vs splice
  5. map, filter, reduce, find, includes
  6. Object: data dengan label
  7. Object.keys, values, entries
  8. Array of objects
  9. Kesalahan umum
  10. Rangkuman

Tujuan bab ini

  • Membuat array, mengakses elemennya, dan mengubahnya dengan push, pop, shift, unshift, slice, dan splice.
  • Mengolah array dengan map, filter, reduce, find, dan includes.
  • Membuat object, mengakses propertinya dengan titik atau kurung, serta menambah dan menghapus properti.
  • Mengolah array of objects, bentuk data yang paling sering kamu temui di aplikasi nyata.

Array: daftar yang berurutan

Array adalah wadah untuk banyak nilai sekaligus, disimpan berurutan. Anggap seperti playlist: setiap lagu punya nomor urut, dan nomor urut pertama adalah 0, bukan 1.

const buah = ["apel", "jeruk", "mangga"];

console.log(buah[0]);            // apel
console.log(buah[2]);            // mangga
console.log(buah.length);        // 3
console.log(buah[buah.length - 1]); // mangga (elemen terakhir)
console.log(buah[5]);            // undefined (index tidak ada)

Array di JavaScript boleh berisi tipe campuran ([1, "dua", true]), tapi dalam praktik sebaiknya isinya sejenis supaya mudah diolah. Mengakses index yang tidak ada tidak memicu error, hasilnya undefined. Sejak ES2022 ada juga buah.at(-1) untuk mengambil elemen terakhir dengan lebih ringkas.

Walaupun dideklarasikan dengan const, isi array tetap bisa diubah. const hanya melarang variabel diisi array lain, bukan mengubah isinya.

Menambah dan menghapus elemen

MethodPosisiAksiMengembalikan
push(x)AkhirMenambahPanjang baru
pop()AkhirMenghapusElemen yang dihapus
unshift(x)AwalMenambahPanjang baru
shift()AwalMenghapusElemen yang dihapus
const antrean = ["Ayu", "Bima"];

antrean.push("Citra");     // ["Ayu", "Bima", "Citra"]
antrean.unshift("Dodi");   // ["Dodi", "Ayu", "Bima", "Citra"]
const keluar = antrean.shift();
console.log(keluar);       // Dodi
antrean.pop();
console.log(antrean);      // ["Ayu", "Bima"]

Keempat method ini mengubah array aslinya (istilahnya mutating). Ingat ini, karena method lain di bawah justru tidak mengubah aslinya.

slice vs splice

Dua nama ini mirip, tapi sifatnya bertolak belakang.

  • slice(awal, akhir) menyalin sebagian array. Index akhir tidak ikut. Array asli tetap utuh.
  • splice(awal, jumlahHapus, ...elemenBaru) memotong langsung array asli: menghapus, menyisipkan, atau keduanya.
const angka = [10, 20, 30, 40, 50];

const potong = angka.slice(1, 3);
console.log(potong); // [20, 30]
console.log(angka);  // [10, 20, 30, 40, 50] (utuh)

const dihapus = angka.splice(1, 2, 99);
console.log(dihapus); // [20, 30]
console.log(angka);   // [10, 99, 40, 50] (berubah)

Cara mengingat: splice punya huruf p seperti potong, jadi dia memotong array aslinya. slice cuma mengambil irisan salinan, seperti memotret sepotong kue tanpa memakannya.

map, filter, reduce, find, includes

Method berikut menerima callback, fungsi yang dijalankan untuk setiap elemen. Semuanya tidak mengubah array asli.

const harga = [15000, 40000, 8000, 25000];

const diskon = harga.map(h => h * 0.9);
console.log(diskon); // [13500, 36000, 7200, 22500]

const mahal = harga.filter(h => h > 20000);
console.log(mahal);  // [40000, 25000]

const total = harga.reduce((jumlah, h) => jumlah + h, 0);
console.log(total);  // 88000

const pertamaMurah = harga.find(h => h < 10000);
console.log(pertamaMurah); // 8000

console.log(harga.includes(40000)); // true
  • map mengubah setiap elemen, hasilnya array baru dengan panjang sama.
  • filter menyaring, hasilnya array baru yang bisa lebih pendek.
  • reduce meringkas seluruh array menjadi satu nilai. Parameter pertama callback adalah akumulator (hasil sementara), dan 0 di akhir adalah nilai awalnya.
  • find mengembalikan elemen pertama yang cocok, atau undefined kalau tidak ada.
  • includes (ES2016) hanya menjawab true atau false.

Cara membaca reduce langkah demi langkah: mulai dari 0, tambah 15000 jadi 15000, tambah 40000 jadi 55000, tambah 8000 jadi 63000, tambah 25000 jadi 88000.

Object: data dengan label

Kalau array cocok untuk daftar, object cocok untuk mendeskripsikan satu hal dengan banyak sifat. Datanya disimpan sebagai pasangan key: value, seperti formulir biodata.

Membuat dan mengakses object

const mhs = {
  nama: "Sinta",
  nim: "021",
  "kota asal": "Bandung",
  sapa() {
    return "Halo, " + this.nama;
  },
};

console.log(mhs.nama);         // Sinta (dot notation)
console.log(mhs["nim"]);       // 021 (bracket notation)
console.log(mhs["kota asal"]); // Bandung
console.log(mhs.sapa());       // Halo, Sinta

Di dalam method, this merujuk ke object yang memanggilnya, jadi this.nama berarti mhs.nama.

Titik atau kurung?

Dot notation lebih ringkas dan dipakai sehari-hari. Bracket notation wajib dipakai saat nama properti mengandung spasi atau tanda minus, atau saat nama propertinya disimpan di variabel:

const kolom = "nim";
console.log(mhs[kolom]); // 021
console.log(mhs.kolom);  // undefined (mencari properti bernama "kolom")

Menambah, mengubah, menghapus

mhs.jurusan = "Informatika"; // menambah properti baru
mhs.nim = "022";             // mengubah nilai
delete mhs["kota asal"];     // menghapus properti

console.log("jurusan" in mhs); // true

Object.keys, values, entries

Object tidak bisa langsung di-map seperti array. Tiga fungsi ini mengubahnya menjadi array dulu:

const nilai = { mtk: 85, ipa: 90, bing: 78 };

console.log(Object.keys(nilai));    // ["mtk", "ipa", "bing"]
console.log(Object.values(nilai));  // [85, 90, 78]
console.log(Object.entries(nilai)); // [["mtk", 85], ["ipa", 90], ["bing", 78]]

for (const [mapel, skor] of Object.entries(nilai)) {
  console.log(`${mapel}: ${skor}`);
}
// mtk: 85
// ipa: 90
// bing: 78

Array of objects

Data dari API atau database hampir selalu berbentuk array berisi object. Di sinilah semua yang kamu pelajari tadi bertemu.

const produk = [
  { nama: "Kaos", harga: 80000, stok: 5 },
  { nama: "Topi", harga: 45000, stok: 0 },
  { nama: "Tas", harga: 150000, stok: 2 },
];

const tersedia = produk.filter(p => p.stok > 0).map(p => p.nama);
console.log(tersedia); // ["Kaos", "Tas"]

const nilaiGudang = produk.reduce((t, p) => t + p.harga * p.stok, 0);
console.log(nilaiGudang); // 700000

console.log(produk.find(p => p.nama === "Topi").harga); // 45000

Rantai filter lalu map dibaca seperti kalimat: "ambil produk yang stoknya ada, lalu ambil namanya".

Kesalahan umum

  • Menganggap index mulai dari 1. Elemen pertama ada di [0], elemen terakhir di [length - 1].
  • Tertukar slice dan splice. splice mengubah array asli, jadi data bisa hilang tanpa sadar.
  • Lupa return di callback berkurung kurawal. harga.map(h => { h * 2 }) menghasilkan array berisi undefined.
  • reduce tanpa nilai awal. Pada array kosong ini memicu TypeError; biasakan memberi nilai awal seperti 0.
  • Memakai dot notation untuk key di variabel. obj.kolom mencari properti bernama "kolom", bukan isi variabelnya.

Rangkuman

  • Array menyimpan data berurutan mulai index 0; push/pop bekerja di akhir, unshift/shift di awal.
  • slice menyalin tanpa mengubah, splice memotong array asli.
  • map, filter, reduce, find, dan includes mengolah array tanpa mengubah aslinya.
  • Object menyimpan pasangan key-value; akses dengan titik atau kurung, tambah dengan penugasan, hapus dengan delete.
  • Object.keys, values, dan entries mengubah object menjadi array agar mudah diolah.

Selesaikan bab ini

  1. 1. Baca materi
  2. 2. Latihan kode (1)
  3. 3. Kuis (4 soal)

Latihan kode: Mengolah data nilai siswa

Setiap fungsi menerima array of objects seperti ini:

[
  { nama: "Ayu", nilai: 88, kota: "Bandung" },
  { nama: "Bima", nilai: 70, kota: "Depok" },
]

Lengkapi:

  1. namaLulus(siswa) mengembalikan array nama siswa dengan nilai minimal 75.
  2. rataRata(siswa) mengembalikan rata-rata nilai. Array kosong menghasilkan 0.
  3. cariSiswa(siswa, nama) mengembalikan object siswa dengan nama itu, atau undefined bila tidak ada.
  4. hitungPerKota(siswa) mengembalikan object berisi jumlah siswa per kota, misalnya { Bandung: 1, Depok: 1 }.

Petunjuk: filter, map, reduce, find, dan bracket notation.

Cek pemahaman

  1. 1Apa yang ditampilkan kode berikut?

    const a = [1, 2, 3, 4, 5];
    const b = a.slice(1, 3);
    console.log(b.length + a.length);
  2. 2Method array mana yang mengembalikan elemen pertama yang memenuhi syarat?

  3. 3Kalau nama properti disimpan di sebuah variabel, kamu perlu bracket notation untuk mengaksesnya.

  4. 4Apa yang ditampilkan kode berikut?

    const nilai = [4, 7, 10];
    const hasil = nilai
      .filter(n => n > 5)
      .reduce((t, n) => t + n, 0);
    console.log(hasil);