BAB 5: Arrays dan Objects - Menyimpan Data Kompleks - Abd. Asis

BAB 5: Arrays dan Objects - Menyimpan Data Kompleks

Setelah belajar function, saatnya kita masuk ke materi yang akan mengubah cara kamu menyimpan dan mengorganisir data—arrays dan objects. Ini adalah fondasi penting untuk membuat aplikasi yang kompleks dan powerful.

Mengapa Perlu Arrays dan Objects?

Bayangkan kamu punya toko online dan perlu menyimpan data beberapa produk. Tanpa arrays dan objects, kamu harus bikin variable terpisah:

let produk1Nama = "Laptop";
let produk1Harga = 5000000;
let produk1Stok = 10;

let produk2Nama = "Mouse";
let produk2Harga = 150000;
let produk2Stok = 25;

// Dan seterusnya... tidak praktis!

Dengan arrays dan objects, kamu bisa mengorganisir data dengan lebih rapi dan efisien.

Arrays: Daftar Data Berurutan

Array adalah container yang bisa menyimpan banyak nilai dalam satu variable. Seperti rak buku yang berisi banyak buku.

Membuat dan Mengakses Array

// Cara membuat array
let buah = ["apel", "pisang", "jeruk", "mangga"];
let angka = [1, 5, 10, 15, 20];
let campuran = ["hello", 42, true, null];

// Mengakses elemen array (dimulai dari index 0)
console.log(buah[0]); // apel (elemen pertama)
console.log(buah[2]); // jeruk (elemen ketiga)
console.log(angka.length); // 5 (jumlah elemen)

Output:

apel
jeruk
5

Mengubah Isi Array

let warna = ["merah", "hijau", "biru"];

// Mengubah elemen
warna[1] = "kuning";
console.log(warna); // ["merah", "kuning", "biru"]

// Menambah elemen di akhir
warna.push("ungu");
console.log(warna); // ["merah", "kuning", "biru", "ungu"]

// Menghapus elemen terakhir
let elementTerakhir = warna.pop();
console.log("Dihapus:", elementTerakhir); // ungu
console.log(warna); // ["merah", "kuning", "biru"]

Output:

["merah", "kuning", "biru"]
["merah", "kuning", "biru", "ungu"]
Dihapus: ungu
["merah", "kuning", "biru"]

Array Methods yang Berguna

JavaScript punya banyak method built-in untuk manipulasi array:

Method Dasar

let numbers = [1, 2, 3, 4, 5];

// unshift & shift - manipulasi awal array
numbers.unshift(0); // Tambah di awal
console.log(numbers); // [0, 1, 2, 3, 4, 5]

let pertama = numbers.shift(); // Hapus dari awal
console.log("Dihapus:", pertama); // 0
console.log(numbers); // [1, 2, 3, 4, 5]

// indexOf & includes - mencari elemen
console.log(numbers.indexOf(3)); // 2 (index elemen 3)
console.log(numbers.includes(4)); // true
console.log(numbers.includes(10)); // false

Output:

[0, 1, 2, 3, 4, 5]
Dihapus: 0
[1, 2, 3, 4, 5]
2
true
false

slice & concat

let fruits = ["apel", "pisang", "jeruk", "mangga", "anggur"];

// slice - ambil sebagian array (tidak mengubah original)
let sebagian = fruits.slice(1, 4); // dari index 1 sampai 3
console.log(sebagian); // ["pisang", "jeruk", "mangga"]
console.log(fruits); // Array asli tidak berubah

// concat - gabungkan array
let buahTropis = ["kelapa", "nanas"];
let semuaBuah = fruits.concat(buahTropis);
console.log(semuaBuah);

Output:

["pisang", "jeruk", "mangga"]
["apel", "pisang", "jeruk", "mangga", "anggur"]
["apel", "pisang", "jeruk", "mangga", "anggur", "kelapa", "nanas"]

Loop untuk Array

Ada beberapa cara untuk iterate (looping) array:

let hobi = ["membaca", "coding", "gaming", "traveling"];

// For loop tradisional
console.log("== For Loop ==");
for (let i = 0; i < hobi.length; i++) {
  console.log(`${i + 1}. ${hobi[i]}`);
}

// For...of loop (lebih modern)
console.log("== For...of Loop ==");
for (let item of hobi) {
  console.log("- " + item);
}

// forEach method
console.log("== forEach ==");
hobi.forEach(function(item, index) {
  console.log(`${index}: ${item}`);
});

Output:

== For Loop ==
1. membaca
2. coding
3. gaming
4. traveling
== For...of Loop ==
- membaca
- coding
- gaming
- traveling
== forEach ==
0: membaca
1: coding
2: gaming
3: traveling

Objects: Data Berstruktur

Object adalah collection of key-value pairs. Seperti kartu identitas yang punya berbagai field.

Membuat dan Mengakses Object

// Membuat object
let mahasiswa = {
  nama: "Andi",
  umur: 20,
  jurusan: "Informatika",
  aktif: true
};

// Mengakses property dengan dot notation
console.log(mahasiswa.nama); // Andi
console.log(mahasiswa.umur); // 20

// Mengakses property dengan bracket notation
console.log(mahasiswa["jurusan"]); // Informatika

// Menambah property baru
mahasiswa.semester = 4;
console.log(mahasiswa);

Output:

Andi
20
Informatika
{nama: "Andi", umur: 20, jurusan: "Informatika", aktif: true, semester: 4}

Object Methods

Object bisa punya method (function yang jadi property):

let kalkulator = {
  nilai: 0,
  
  tambah: function(angka) {
    this.nilai += angka;
    return this;
  },
  
  kali: function(angka) {
    this.nilai *= angka;
    return this;
  },
  
  hasil: function() {
    return this.nilai;
  },
  
  reset: function() {
    this.nilai = 0;
    return this;
  }
};

// Method chaining
let hasil = kalkulator.tambah(5).kali(3).tambah(2).hasil();
console.log("Hasil:", hasil); // (5 * 3) + 2 = 17

kalkulator.reset();
console.log("Setelah reset:", kalkulator.nilai);

Output:

Hasil: 17
Setelah reset: 0

Array of Objects

Kombinasi powerful: array yang berisi objects!

let produk = [
  {
    id: 1,
    nama: "Laptop Gaming",
    harga: 15000000,
    kategori: "Elektronik",
    tersedia: true
  },
  {
    id: 2,
    nama: "Kaos Polos",
    harga: 75000,
    kategori: "Fashion",
    tersedia: true
  },
  {
    id: 3,
    nama: "Sepatu Sneakers",
    harga: 450000,
    kategori: "Fashion",
    tersedia: false
  }
];

// Akses data
console.log("Produk pertama:", produk[0].nama);
console.log("Harga laptop:", produk[0].harga);

// Loop untuk tampilkan semua produk
console.log("== Daftar Produk ==");
for (let item of produk) {
  let status = item.tersedia ? "Tersedia" : "Habis";
  console.log(`${item.nama} - Rp ${item.harga.toLocaleString()} (${status})`);
}

Output:

Produk pertama: Laptop Gaming
Harga laptop: 15000000
== Daftar Produk ==
Laptop Gaming - Rp 15.000.000 (Tersedia)
Kaos Polos - Rp 75.000 (Tersedia)
Sepatu Sneakers - Rp 450.000 (Habis)

Destructuring: Unpacking Data

Destructuring memungkinkan kamu “membongkar” array atau object jadi variable terpisah:

Array Destructuring

let koordinat = [10, 20, 30];

// Cara lama
let x1 = koordinat[0];
let y1 = koordinat[1];
let z1 = koordinat[2];

// Cara modern dengan destructuring
let [x, y, z] = koordinat;
console.log(`X: ${x}, Y: ${y}, Z: ${z}`);

// Skip element yang tidak dibutuhkan
let [first, , third] = [1, 2, 3];
console.log(`First: ${first}, Third: ${third}`);

// Default values
let [a, b, c = 0] = [5, 10];
console.log(`A: ${a}, B: ${b}, C: ${c}`);

Output:

X: 10, Y: 20, Z: 30
First: 1, Third: 3
A: 5, B: 10, C: 0

Object Destructuring

let user = {
  firstName: "John",
  lastName: "Doe",
  age: 25,
  city: "Jakarta"
};

// Extract properties ke variables
let {firstName, age} = user;
console.log(`Nama: ${firstName}, Umur: ${age}`);

// Rename variables
let {firstName: nama, lastName: namaBelakang} = user;
console.log(`${nama} ${namaBelakang}`);

// Default values
let {firstName: fn, country = "Indonesia"} = user;
console.log(`${fn} dari ${country}`);

Output:

Nama: John, Umur: 25
John Doe
John dari Indonesia

Spread Operator (…)

Spread operator berguna untuk “menyebarkan” elements array atau properties object:

Spread dengan Arrays

let angka1 = [1, 2, 3];
let angka2 = [4, 5, 6];

// Gabungkan arrays
let gabungan = [...angka1, ...angka2];
console.log(gabungan); // [1, 2, 3, 4, 5, 6]

// Copy array
let copy = [...angka1];
copy.push(4);
console.log("Original:", angka1); // [1, 2, 3]
console.log("Copy:", copy); // [1, 2, 3, 4]

// Spread sebagai arguments
function jumlahkan(a, b, c) {
  return a + b + c;
}

let nilai = [10, 20, 30];
console.log("Hasil:", jumlahkan(...nilai)); // 60

Output:

[1, 2, 3, 4, 5, 6]
Original: [1, 2, 3]
Copy: [1, 2, 3, 4]
Hasil: 60

Spread dengan Objects

let alamat = {
  jalan: "Jl. Merdeka No. 1",
  kota: "Jakarta",
  kodePos: "12345"
};

let person = {
  nama: "Budi",
  umur: 30
};

// Gabungkan objects
let lengkap = {...person, ...alamat};
console.log(lengkap);

// Override properties
let updated = {...person, umur: 31, pekerjaan: "Developer"};
console.log(updated);

Output:

{nama: "Budi", umur: 30, jalan: "Jl. Merdeka No. 1", kota: "Jakarta", kodePos: "12345"}
{nama: "Budi", umur: 31, pekerjaan: "Developer"}

Higher-Order Array Methods

Method advanced yang sangat berguna untuk data processing:

map() - Transform Data

let numbers = [1, 2, 3, 4, 5];

// Transform setiap element
let doubled = numbers.map(n => n * 2);
console.log("Doubled:", doubled); // [2, 4, 6, 8, 10]

// Transform objects
let users = [
  {nama: "John", umur: 25},
  {nama: "Jane", umur: 30},
  {nama: "Bob", umur: 35}
];

let names = users.map(user => user.nama);
console.log("Names:", names); // ["John", "Jane", "Bob"]

Output:

Doubled: [2, 4, 6, 8, 10]
Names: ["John", "Jane", "Bob"]

filter() - Saring Data

let ages = [15, 22, 18, 30, 16, 25];

// Filter umur >= 18
let adults = ages.filter(age => age >= 18);
console.log("Adults:", adults); // [22, 18, 30, 25]

// Filter products yang tersedia
let products = [
  {nama: "Laptop", harga: 5000000, tersedia: true},
  {nama: "Mouse", harga: 150000, tersedia: false},
  {nama: "Keyboard", harga: 300000, tersedia: true}
];

let available = products.filter(p => p.tersedia);
console.log("Tersedia:", available.map(p => p.nama)); // ["Laptop", "Keyboard"]

Output:

Adults: [22, 18, 30, 25]
Tersedia: ["Laptop", "Keyboard"]

reduce() - Aggregate Data

let prices = [100000, 250000, 150000, 75000];

// Hitung total
let total = prices.reduce((sum, price) => sum + price, 0);
console.log("Total:", total); // 575000

// Cari harga tertinggi
let maxPrice = prices.reduce((max, price) => price > max ? price : max, 0);
console.log("Harga tertinggi:", maxPrice); // 250000

// Group by category
let items = [
  {nama: "Laptop", kategori: "Elektronik", harga: 5000000},
  {nama: "Baju", kategori: "Fashion", harga: 100000},
  {nama: "Mouse", kategori: "Elektronik", harga: 150000}
];

let groupByCategory = items.reduce((acc, item) => {
  if (!acc[item.kategori]) {
    acc[item.kategori] = [];
  }
  acc[item.kategori].push(item);
  return acc;
}, {});

console.log(groupByCategory);

Output:

Total: 575000
Harga tertinggi: 250000
{
  Elektronik: [
    {nama: "Laptop", kategori: "Elektronik", harga: 5000000},
    {nama: "Mouse", kategori: "Elektronik", harga: 150000}
  ],
  Fashion: [
    {nama: "Baju", kategori: "Fashion", harga: 100000}
  ]
}

JSON: JavaScript Object Notation

JSON adalah format untuk bertukar data antar aplikasi:

let user = {
  name: "John",
  age: 30,
  hobbies: ["reading", "coding"],
  active: true
};

// Object ke JSON string
let jsonString = JSON.stringify(user);
console.log("JSON String:", jsonString);

// JSON string ke Object
let parsedUser = JSON.parse(jsonString);
console.log("Parsed Object:", parsedUser);
console.log("Name:", parsedUser.name);

// JSON dengan indentasi (untuk debugging)
let prettyJson = JSON.stringify(user, null, 2);
console.log("Pretty JSON:");
console.log(prettyJson);

Output:

JSON String: {"name":"John","age":30,"hobbies":["reading","coding"],"active":true}
Parsed Object: {name: "John", age: 30, hobbies: ["reading", "coding"], active: true}
Name: John
Pretty JSON:
{
  "name": "John",
  "age": 30,
  "hobbies": [
    "reading",
    "coding"
  ],
  "active": true
}

Latihan Praktis

Mari buat beberapa function yang menggunakan arrays dan objects:

1. Todo List Manager

function createTodoManager() {
  let todos = [];
  let nextId = 1;
  
  return {
    add: function(task) {
      todos.push({
        id: nextId++,
        task: task,
        completed: false,
        createdAt: new Date()
      });
    },
    
    complete: function(id) {
      let todo = todos.find(t => t.id === id);
      if (todo) {
        todo.completed = true;
      }
    },
    
    list: function() {
      return todos.map(t => ({
        id: t.id,
        task: t.task,
        status: t.completed ? "✅" : "⏳"
      }));
    },
    
    pending: function() {
      return todos.filter(t => !t.completed);
    }
  };
}

let todoList = createTodoManager();
todoList.add("Belajar JavaScript");
todoList.add("Buat project");
todoList.add("Push ke GitHub");

todoList.complete(1);

console.log("Semua todos:", todoList.list());
console.log("Yang belum selesai:", todoList.pending());

Output:

Semua todos: [
  {id: 1, task: "Belajar JavaScript", status: "✅"},
  {id: 2, task: "Buat project", status: "⏳"},
  {id: 3, task: "Push ke GitHub", status: "⏳"}
]
Yang belum selesai: [
  {id: 2, task: "Buat project", completed: false, createdAt: ...},
  {id: 3, task: "Push ke GitHub", completed: false, createdAt: ...}
]

2. Shopping Cart

function createShoppingCart() {
  let items = [];
  
  return {
    addItem: function(product, quantity = 1) {
      let existingItem = items.find(item => item.product.id === product.id);
      
      if (existingItem) {
        existingItem.quantity += quantity;
      } else {
        items.push({product, quantity});
      }
    },
    
    removeItem: function(productId) {
      items = items.filter(item => item.product.id !== productId);
    },
    
    updateQuantity: function(productId, quantity) {
      let item = items.find(item => item.product.id === productId);
      if (item) {
        item.quantity = quantity;
      }
    },
    
    getTotal: function() {
      return items.reduce((total, item) => {
        return total + (item.product.price * item.quantity);
      }, 0);
    },
    
    getItems: function() {
      return items.map(item => ({
        nama: item.product.name,
        harga: item.product.price,
        quantity: item.quantity,
        subtotal: item.product.price * item.quantity
      }));
    }
  };
}

// Test shopping cart
let cart = createShoppingCart();

cart.addItem({id: 1, name: "Laptop", price: 5000000}, 1);
cart.addItem({id: 2, name: "Mouse", price: 150000}, 2);

console.log("Items di cart:", cart.getItems());
console.log("Total:", cart.getTotal().toLocaleString());

Output:

Items di cart: [
  {nama: "Laptop", harga: 5000000, quantity: 1, subtotal: 5000000},
  {nama: "Mouse", harga: 150000, quantity: 2, subtotal: 300000}
]
Total: 5.300.000

Error Umum dan Solusinya

1. Array Index Out of Bounds

let fruits = ["apel", "pisang"];

console.log(fruits[5]); // undefined (tidak error, tapi tidak ada data)

// Solusi: selalu cek length atau gunakan optional chaining
if (fruits[5]) {
  console.log(fruits[5]);
} else {
  console.log("Index tidak ada");
}

2. Object Property Tidak Ada

let user = {name: "John"};

console.log(user.age); // undefined

// Solusi: gunakan default values atau optional chaining
console.log(user.age || 18); // Default 18
console.log(user.address?.city); // Optional chaining

Tips Best Practices

  1. Gunakan const untuk arrays/objects yang tidak di-reassign:

    const fruits = ["apel", "pisang"]; // Bisa push/pop
    // fruits = []; // Error! Tidak bisa reassign
    
  2. Gunakan method modern:

    // Bagus
    const names = users.map(u => u.name);
    
    // Kurang bagus
    const names = [];
    for (let i = 0; i < users.length; i++) {
      names.push(users[i].name);
    }
    
  3. Gunakan descriptive names:

    // Bagus
    const activeUsers = users.filter(user => user.isActive);
    
    // Kurang jelas
    const filtered = users.filter(u => u.isActive);
    

Penutup

Arrays dan objects adalah fondasi data structure di JavaScript. Dengan menguasai keduanya, kamu bisa:

  • Mengorganisir data kompleks dengan rapi
  • Membuat aplikasi yang scalable
  • Menggunakan modern JavaScript features seperti destructuring dan spread operator
  • Memproses data dengan efficient menggunakan array methods

Di bab ini kamu sudah belajar:

  • Arrays: membuat, mengakses, manipulasi, dan methods
  • Objects: properties, methods, dan nested structures
  • Array of objects untuk data kompleks
  • Destructuring untuk unpacking data
  • Spread operator untuk copying dan merging
  • Higher-order methods: map, filter, reduce
  • JSON untuk data exchange
  • Best practices dan error handling

Selanjutnya, kita akan belajar tentang DOM manipulation—cara JavaScript berinteraksi dengan HTML untuk membuat web yang interaktif. Siap untuk membuat website yang dynamic?