Latihan buat 04 Struktur Data Objek dan Array. Konsep: array dan method-nya, loop, argumen opsional, objek bersarang, rekursi pada data. Jawaban di 04 Kunci Jawaban Struktur Data.

4.1 Jumlah dari Rentang

Tulis range(start, end) yang mengembalikan array berisi semua angka dari start sampai termasuk end. Lalu tulis sum(array) yang menjumlahkan array angka. Bonus: buat range menerima argumen ketiga opsional step, dan pastikan step negatif juga jalan (range(5, 2, -1) → [5, 4, 3, 2]).

Kode awal:

// tulis kodemu di sini
 
console.log(range(1, 10));
// → [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(range(5, 2, -1));
// → [5, 4, 3, 2]
console.log(sum(range(1, 10)));
// → 55

Petunjuk: mulai dari array kosong [], isi dengan push, kembalikan array-nya. Batas akhir inklusif jadi pakai <=. step bisa jadi parameter default; untuk step negatif, arah loop dan perbandingannya (>=) berbeda. Konsep di 04 Struktur Data Objek dan Array > Arrayologi Lanjutan.

→ Jawaban: 04 Kunci Jawaban Struktur Data > 4.1 Jumlah dari Rentang

4.2 Membalik Array

Tulis dua fungsi tanpa memakai method reverse bawaan: reverseArray(array) mengembalikan array baru dengan urutan terbalik, dan reverseArrayInPlace(array) mengubah array aslinya jadi terbalik.

Kode awal:

// tulis kodemu di sini
 
console.log(reverseArray(["A", "B", "C"]));
// → ["C", "B", "A"]
let arr = [1, 2, 3, 4, 5];
reverseArrayInPlace(arr);
console.log(arr);
// → [5, 4, 3, 2, 1]

Petunjuk: yang pertama: loop mundur dan push ke array baru. Yang kedua: tukar elemen i dengan array.length - 1 - i, hanya sampai setengah panjang (Math.floor(length / 2)), pakai variabel sementara buat menahan satu nilai saat menukar. Terkait efek samping di 03 Fungsi > Fungsi dan Efek Samping.

→ Jawaban: 04 Kunci Jawaban Struktur Data > 4.2 Membalik Array

4.3 List Bertaut

List adalah objek bersarang: {value: 1, rest: {value: 2, rest: {value: 3, rest: null}}}. Tulis arrayToList(array), listToArray(list), prepend(value, list) (menambah elemen di depan), dan nth(list, n) (elemen ke-n, atau undefined). Kalau bisa, tulis juga nth versi rekursif.

Kode awal:

// tulis kodemu di sini
 
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}
console.log(listToArray(arrayToList([10, 20, 30])));
// → [10, 20, 30]
console.log(nth(arrayToList([10, 20, 30]), 1));
// → 20

Petunjuk: bangun list dari belakang ke depan (list = {value: x, rest: list}). Buat menjelajahi list: for (let node = list; node; node = node.rest). nth rekursif: kalau n == 0 kembalikan list.value, kalau tidak nth(list.rest, n - 1). Konsep di 04 Struktur Data Objek dan Array > Objek.

→ Jawaban: 04 Kunci Jawaban Struktur Data > 4.3 List Bertaut

4.4 Perbandingan Dalam

== membandingkan objek berdasarkan identitas. Tulis deepEqual(a, b) yang mengembalikan true kalau keduanya nilai yang sama, atau objek dengan properti yang sama (nilai propertinya dibandingkan dengan deepEqual lagi, rekursif).

Kode awal:

// tulis kodemu di sini
 
let obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true

Petunjuk: kalau a === b, langsung true. Kalau salah satu bukan objek (cek typeof x == "object" && x != null — ingat typeof null itu "object"!), kembalikan hasil ===. Kalau dua-duanya objek, bandingkan jumlah kunci (Object.keys) dan tiap nilai propertinya secara rekursif. Konsep di 04 Struktur Data Objek dan Array > Mutabilitas.

→ Jawaban: 04 Kunci Jawaban Struktur Data > 4.4 Perbandingan Dalam