9 Arrays
Arrays adalah suatu type yang berupa kumpulan beberapa expression. Tiap-tiap expression ini dipisahkan oleh tanda koma, dan expression tersebut disebut element. Kumpulan expression ini diapit oleh tanda kurung siku. Pembentukan array semacam ini disebut array literals. Urutan expression itu muncul dalam array sangatlah penting. Berbeda urutan element, berarti menunjukkan array yang berbeda pula. Urutan dalam array ini disebut index. Index atau posisi numerik dari array ini sangat penting diketahui untuk mengakses element yang kita ingin tampilkan (proses querying). Di dalam JavaScript index berupa bilanga bulat dimulai dari angka 0 hingga maksimum dari bilangan integer positif yang mampu diwakili oleh komputer. Di dalam mesin yang saya miliki berada di kisaran \(2^{1024} \approx 10^{308}\) bandingkan dengan jumlah butiran pasir di seluruh dunia di sekitar \(10^{27}\) (du Sautoy, 2012). Tetapi di dalam prakteknya kita tidak pernah menggunakan element array berukuran mencapai \(10^{308}\) karena keterbatasan memory dan CPU yang kita miliki.
Beberapa sifat-sifat array yang perlu dipahami adalah - untyped: tipe-tipe data yang dimiliki oleh tiap element di dalam array dapat berbeda-beda - dynamics*: ukuran (jumlah element) array dapat berubah-ubah sesuai kebutuhan
Pada bagian berikutnya kita akan membahas hal berikut: - Cara membuat array - Membaca dan menuliskan elemen suatu array - Membuat sparse array - Mengetahui ukuran array - Menambahkan dan menghapus element suatu array - Melakukan iterasi pada element array - Array multidimensi (nested array) - Beberapa methods di dalam arrays - Object yang memiliki sifat seperti array - Melihat string sebagai array
9.1 Creating an array
Ada beberapa cara untuk membuat array - Menggunaan array literals
create-arr-literal.js
``js let empty = []; // Array tanpa element let primes = [2, 3, 5, 7, 11]; // Array dengen element berupa bilangan prima let various = [1, 'apple', true, 3.14] // Array dengan elemen berbagi
type`
// Array dengan elemen berupa expression
let base_address = ‘Perum.’;
let addresses = [
base_address + ‘Bangun Reksa’,
base_address + ‘Graha Indah’,
base_address + ‘Grand City’];
console.log(addresses);
// Array yang memuat dua arrays dan masing-masing array tersebut
// memuat satu bilangan integer dan satu object yang memiliki
// dua properties bernama x
dan y
let mixed_arr = [
[1, {x: 1, y: 2}],
[2, {x: 3, y: 4}]
]
console.log(mixed_arr);
// Array dengan ukuran 4. Tanda koma setelah koma dianggap
// element undefined
let arr_with_undefined = [‘a’, ,‘c’, ,‘e’, , ,];
console.log(arr_with_undefined)
console.log(arr_with_undefined.length);
console.log(typeof arr_with_undefined[1]);
// Array dengan ukuran 2. Tanda koma setelah
// koma dianggap element undefined
let non_zero_length = [ , , , ];
console.log(non_zero_length.length);
```
Menggunakan spread operator
create-arr-spread-op.js
// Menyisipkan array a ke array b let arr1 = ['a', 'b', 'c']; let arr2 = ['z', ...arr2, 'x']; console.log(arr2); // Spread operator dapat digunakan untuk menggandakan array let original = ['a', 'b', 'c']; let copy = [...original]; copy[0] = 0; // Mengubah element index 0 array `copy` tidak mengubah // element index 0 array `original` console.log(original[0]) // Menggunakan spread operator untuk string akan mengubahnya menjadi array let digits = [..."0123456789ABCDEF"]; console.log(digits);
Menggunakan object
Array()
create-arr-arr-obj.js
let a = new Array(); console.log(a); // Array tanpa element, setara dengan [] let b = new Array(10); console.log(b); // Array kosong namun dengan ukuran 10 // Mendata semua elemen, meskipun tidak efisien dibandingkang // menggunakan array literal let c = new Array('e', 'd', 'c', 'b', 'a', 'hello world'); console.log(c);
Menggunakan
Array.of()
create-arr-arr-of-and-from.js
9.2 Reading and writing elements of an array
Pembacaan dan penulisan elements di array sangat mirip dengan querying and setting property di object yang sudah dibahas pada pertemuan sebelumnya
read-and-write-elements.js
let a = ['world']; // Definisikan array dengan satu element string 'world'
let value = a[0]; // Membaca element di index 0 dan memberikan nilainya
// ke variable `value`
console.log(value)
a[1] = 3.14; // Menuliskan element di index 1
console.log(a);
// Indexing dapat dilakukan dengan bilangan tidak bulat (non-integer)
// dan negatif yang akan menghasilkan suatu element berupa object
a[-1.23] = true; // akan menambahkan object dengan property '-1.23': true
console.log(a);
// Index dengan string yang bernilai bilangan bulat akan diproses
// sebagai index bilangan bulat
a["100"] = 0;
console.log(a);
// Index dengan bilangan desimal (namun angka dibelakang koma adala nol)
// akan diproses sebagai index bilangan bulat
a[1.000] = 1;
console.log(a);
a = [true, false];
// Membaca element yang tidak terdapat di suatu array akan memberikan `undefined`
console.log(a[2]);
// Berbeda dengan bahasa pemrograman Python, kita tidak dapat menggunakan index
// bilangan bulat negatif untuk membaca element di index terakhir
console.log(a[-1]); // => undefined
Perlu diperhatikan perbedaan antara index suatu array dan
property name suatu object. Meskipun keduanya sangat mirip, namun
keduanya memiliki perbedaan yang mendasar. Semua indexes (bilangan
integer dari 0 hingga Number.MAX_VALUE
) dapat digunakan sebagai
property name
. Namun tidak semua property names dapat digunakan
sebagai index
.
9.3 Creating a sparse array
Sparse array adalah suatu array yang mayoritas elementnya belum didefinisikan.
Contoh element yang ada nilainya hanya ada di index = 0 dan index = 100.
Index selain kedua index tersebut (index = 1 hingga index = 99) akan
didefinisikan nilainya sebagai undefined
.
sparse-arr.js
let a = new Array(5); // membuat *sparse array* yang berukuran 5
// Mengubah ukuran array `a` dengan menuliskan elemen ke-1001.
a[1000] = 0;
console.log(a);
// Ketiga array berikut meskipun memiliki nilai element yang sama (`undefined`)
// ketika di print out menggunakan console.log(), namun mereka memiliki
// karakteristik yang berbeda
let arr1 = []; // Array tanpa element dengan ukuran 0
let arr2 = [,]; // Array tanpa element dengan ukuran 1
let arr3 = [undefined]; // Array dengan element `undefined` dengan ukuran 1
9.4 Determining the length of an array
Untuk mengetahui ukuran suatu array dapat digunakan perintah .length
;
Melakukan setting ke property .length
akan memodifikasi ukuran array
(array akan terpotong atau diperpanjang).
arr-length.js
console.log([].length); // => 0; array [] tidak memiliki element
// memiliki ukuran (jumlah element) 3
console.log(['a', 'b', 'c'].length); s // => 3
// Pemotongan dan pemanjangan ukuran array
let arr = ['a', 'b', 'c', 'd', 'e'];
arr.length = 3;
console.log(arr); // => ['a', 'b', 'c']
arr.length = 0; // hapus semua elements
console.log(arr); // => []
arr.length = 5; // => array tanpa elements namun berukuran 5
console.log(arr);
9.5 Adding and removing elements of an array
Ada dua cara untuk menambahkan element yaitu menggunakan index dan push
Untuk menghapus suatu element dapat menggunakan operator delete dan diikuti pembacaan array untuk index yang ingin dihapus
add-and-delete-element.js
let arr1 = ['a', 'b', 'c'];
// Penambahan dilakukan dimulai dari ukuran element,
// Jika indeks merupakan indeks element yang sebelumnya sudah terdapat element
// maka yang terjadi bukan penambahan melainkan mengganti nilainya
arr1[3] = 'zero';
arr1[4] = 'one';
console.log(arr1);
let arr2 = ['a', 'b', 'c'];
arr2.push('zero');
arr2.push('one')
Pada bagian selanjutnya akan di bahas menggunakan cara yang lebih elegan menggunakan splice(). splice method ini mampu melakukan penyisipan penghapusan, dan penggantian element.
9.6 Performing iteration to an array
Untuk dapat mencacah satu per satu element dalam array dapat digunakan
- control structure
for/of
loop, - control structure
for
loop, - control structure
for/of
loop dan.entries()
iterate-arr.js
let letters, string;
letters = [..."Hello world"];
// Menggunakan for/of loop
string = "";
for (let letter of letters) {
string += letter;
}
console.log(string); // Didapatkan hasil yang serupa dengan `letters`
// Menggunakan `for`
string = "";
for (let i = 0; i < letters.length; i++) {
string += letters[i];
}
console.log(string);
// Menggunakan for/of loop dan .entries()
string = "";
for (let [index, letter] of letters.entries()) {
string += letters[i];
}
console.log(string);
9.7 Multidimensional array
Element dari suatu array dapat juga berupa array. Proses ini terus dapat diulangi tergantung dengan jumlah dimensi array yang ingin kita buat
multidim-arr.js
// Contoh data dengan 2D array
let expenseAndPrice = [
["Breakfast at locak food stall", 20_000],
["Transportation to work", 10_000],
["Lunch with colleagues", 50_000],
["Snacks from a convenience store", 15_000],
["Dinner at home", 30_000]
];
console.log(expenseAndPrice);
console.log();
// Contoh data dengen 3D array
let weeklyExpenses = [
["Monday, March 21", [
["Breakfast at locak food stall", 20_000],
["Transportation to work", 10_000],
["Lunch with colleagues", 50_000],
["Snacks from a convenience store", 15_000],
["Dinner at home", 30_000]
]
],
["Tuesday, March 22", [
["Breakfast at home", 10_000],
["Coffee from a cafe", 25_000],
["Groceries for the week", 150_000],
["Lunch from a food delivery app", 35_000],
['Snack from a street vendor', 10_000]
]
]
]
console.log(weeklyExpenses);
9.8 Some useful methods in an array
Methods dalam array sangatlah banyak karena luasnya penerapan struktur data atau type ini. Kita dapat kelompokkan menjadi 4 grup methods yang terdapat di dalam array:
Methods yang berfungsi untuk melakukan iterasi
Methods yang berfungsi untuk pembentukan struktur data stack (LIFO: Last-In First Out) dan queue (FIFO: First-In First Out).
Methods yang bekerja pada sebagian elements array (subarray) untuk melakukan pengambilan, penghapusan, penyisipan, pengisian, dan pengggandaan elements.
Methods yang digunakan untuk mencari posisi index suatu element dan pengurutan elements suatu array
9.8.1 Array iterator methods
forEach()
Melakukan iterasi tanpa control structures”for
loop. Teknik ini banyak digunakan dalam paradigma pemrograman fungsional (di bahas lebih lanjut di perkuliahan web pemrograman* tingkat lanjut). Beberapa contoh berikut banyak menggunakan input berupa arrow function yang akan kita bahas di pertemuan berikutnya tentang fungsi.for-each-demo.js
map()
Merupakan method yang ringkas untuk mengaplikasikan fungsi ke setiap element di dalam array, tanpa control structurefor
loop.map-demo.js
filter()
Digunakan untuk menyeleksi menggunakan nilai Boolean, elements yang akan di ambil dari suatu arrayfilter-demo.js
find()
danfindIndex()
Digunakan untuk untuk mencari element di suatu array.find()
akan menghasilkan semua elements yang ditemukan. SedangkanfindIndex()
akan memberikan posisi dari semua *element** yang ditemukanfind-and-find-index-demo.js
every()
dansome()
Digunakan untuk memeriksa apakah semua elements di dalam suatu array telah memenuhi kondisi Boolean yang diberikan.every-and-some-demo.js
reduce()
danreduceRight()
Digunakan untuk mereduksi elements di suatu array menjadi satu nilai tunggal. Maksud mereduksi disini adalah kita dapat mendefinisikan bagaimana dua elements di dalam array berinteraksi (dioperasikan/digabungkan/dikombninasikan). UntukreduceRight()
adalah variasi darireduce()
namun operasi reduksi dimulai dari dua pasangan terakhir element paling kanan.reduce-and-reduce-right-demo.js
9.8.2 Methods for creating stacks and queues
Pada bagian ini ada 4 methods yaitu:
- push()
: digunakan untuk menambahkan satu atau lebih element
di ujung kanan array (di index terakhir)
- pop()
: digunakan untuk menghapus satu element di ujung kanan array
(di index terakhir)
- unshift()
: digunakan untuk menambahkan satu atau lebih element
di ujung kiri array (di index pertama);
- shift()
: digunakan untuk menghapus satu element* di ujung kiri
array (di index pertama);
stack-end-and-start-demo.js
let data = ['a', 'b', 'c', 'd', 'e'];
stack_end = Array.from(data); // menggandakan array `data`
stack_end.push('f', 'g'); console.log(stack_end);
// Menghapus satu per satu element terakhir
stack_end.pop(); console.log(stack_end);
stack_end.pop(); console.log(stack_end);
stack_end.pop(); console.log(stack_end);
console.log(); // untuk memberi spasi dari print out sebelumnya
stack_start = Array.from(data); // menggandakan array `data`
stack_start.unshift(7, 8, 9); console.log(stack_start);
// Menghapus satu per satu element pertama
stack_start.shift(); console.log(stack_start);
stack_start.shift(); console.log(stack_start);
stack_start.shift(); console.log(stack_start);
9.8.3 Methods on subarrays
slice()
Digunakan untuk merndapatkan subarray dari suatu array.slice-demo.js
let data = ['a', 'b', 'c', 'd', 'e']; let result; // Lakukan pengambilan subarray dari index 0 hingga index 3 - 1; result = data.slice(0, 3); console.log(result); // Lakukan pengambilan subarray dari index 3 result = data.slice(3); console.log(result); // Lakukan pengambilan subarray dari index 1, hingga index terakhir (-1) result = data.slice(1, -1); console.log(result); // Lakukan pengambilan subarray dari index -3 (tiga terakhir dari kanan) // hingga index -2 (dua terakhir dari kanan) result = data.slice(-3, -2); console.log(result);
splice()
Merupakan array method yang memiliki kegunaa beragam, seperti yang telah disinggung di paragraf sebelumnyasplice-demo.js
let data, result; // Melakukan pemotongan array di indeks 4 data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; result = data.splice(4); console.log(result); console.log(data); console.log(); // Melakukan pemotongan array di indeks 1 hingga indeks 2 data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; result = data.splice(1, 2); console.log(result); console.log(data); console.log(); // Melakukan pemotongan array di indeks 1 hingga indeks 1 data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; result = data.splice(1, 1); console.log(result); console.log(data); console.log(); // Melakukan penghapusan dimulai dari index 2 sebanyak 0 element // kemudian disisipkan dua elements `fill01` dan `fill02` data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; result = data.splice(2, 0, 'fill01', 'fill02'); console.log(result); console.log(data); console.log(); // Melakukan penghapusan dimulai dari index 2 sebannyak 2 elements // kemudian disisipkan dua elements [1, 2] dan 5 data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; result = data.splice(2, 2, [1, 2], 5); console.log(result); console.log(data);
fill()
Digunakan untuk pengisian elements pada array.fill-demo.js
let data; // Mengisi semua element dengan angka 0 data = ['a', 'b', 'c', 'd', 'e']; data.fill(0); console.log(data); // Mengisi array dengan angka 9 dimulai dari indeks 1 hingga akhir data = ['a', 'b', 'c', 'd', 'e']; data.fill(9, 1); console.log(data); // Mengisi array dengan angka 8 dimulai dari indeks 2 hingga indeks // terakhir dikurangi 1 (indeks terakhir kedua) data = ['a', 'b', 'c', 'd', 'e']; data.fill(8, 2, -1); console.log(data);
copyWithin()
Digunakan untuk menggandakan subarray di dalam array tersebut ke posisi yang baru.copyWithin()
let data; // Menggandakan array data ditempatkan mulai dari indeks 1. // Element pada posisi indeks 1 hingga akhir akan di-overwrite. data = ['a', 'b', 'c', 'd', 'e']; data.copyWithin(1); console.log(data); // Menggandakan array data ditempatkan mulai dari indeks 2 // dari array data yang dimulai dari indeks 3 hingga element ke 5 // (indeks ke = 5-1 = 4) = ['d', 'e'] // Element pada indeks 3 dan 4 akan di-overwrite dengan ['d','e'] data = ['a', 'b', 'c', 'd', 'e']; data.copyWithin(2, 3, 5); console.log(data); // Menggandakan array data ditempatkan mulai dari indeks 0 // dari array data terakhir kedua (indeks -2) hingga element terakhir // = ['d', 'e'] // Element pada indeks 1 dan 2 akan di-overwrite dengan ['d', 'e'] data = ['a', 'b', 'c', 'd', 'e']; data.copyWithin(0, -2); console.log(data);
9.8.4 Array searching and sorting methods
indexOf()
danlastIndexOf()
Berbeda dengan methods sebelumnya (find()
danfindIndex()
), methods ini hanya akan memberikan element index yang pertama kali ditemukan. Serta argument yang digunakan berupa nilai element. UntuklastIndexOf()
pencarian dimulai dari index terakhir.index-of-and-last-index-of.js
let data = ['a', 'b', 'c', 'b', 'c']; let result // Memberikan index untuk element 'c' yang pertama kali // ditemukan result = data.indexOf('c'); console.log(result); // Melakukan pencarian dari element terakhir dan // menghasilkan index untuk element 'b' yang pertama kali // ditemukan result = data.lastIndexOf('b'); console.log(result); // Melakukan pencarian untuk element yang tidak ada di // dalam array akan menghasilkan nilai -1 result = data.indexOf('f'); console.log(result);
includes()
Digunakan untuk memeriksa apakah suatu element terdapat dalam suatu arrayincludes-demo.js
sort()
Digunakan untuk mengurutkan elements pada suatu array berdasarkan alphabetical order. Jadi perlu hati-hati menggunakan methods ini. Untuk mengurutkan angka maka perlu mendefinisikan fungsi sorting tersendiri.sort-demo.js
let arr = ['banana', 'cherry', 'apple']; arr.sort(); console.log(arr); let numericArr; // Secara default .sort mengurutkan angka berdasarkan alphabet // Semua angka akan diubah ke dalam string numericArr = [33, 4, 1111, 222]; numericArr.sort(); console.log(numericArr); // Mengurutkan angka berdasarkan nilainya make perlu mendefinisikan // ulang fungsi sorting numericArr = [33, 4, 1111, 222]; numericArr.sort((x, y) => { return x - y; }); console.log(numericArr)
reverse()
Digunakan untuk membalik urutan element yang ada dalam suatu arrayreverse-demo.js
9.9 Objects that is similar to array
Kita dapat membentuk suatu object menjadi suatu array. Sehingga dapat dilakukan iterasi layaknya iterasi pada array.
Berikut adalah contoh penggunaan object yang dapat dipandang sebagai suatu array sehingga dapat dilakukan proses looping
array-like-obj.js
let arrLikeObj = {}; // Mendeklarasikan object tanpa properties
const objLength = 10;
// Menambahkan property ke `arrLikeObj`
for (let i = 0; i < objLength; i++) {
arrLikeObj[i] = `item${(i+1).toString().padStart(2, '0')}`;
}
console.log(arrLikeObj);
arrLikeObj.length = objLength;
// Sekarang kita mencoba untuk melakukan iterasi ke `arrLikeObj`
for (let i = 0; i < arrLikeObj.length;i++) {
console.log(arrLikeObj[i]);
}
9.10 Thinking a string as an array
Setiap karakter di dalam string dapat diakses layaknya elements di dalam suatu array.
str-as-arr.js
Exercises
[30 poin] Pelajari terkait implementasi LIFO (Last-In First Out) dan FIFO (First-In First-Out) menggunakan array. Carilah kasus nyata penggunaan LIFO dan FIFO dan ceritakan dalam bentuk contoh penggunaan.
[70 poin] Dalam bidang business analytics dikenal suatu indikator bernama ROI (Return on Investment). Rumus sederhana untuk menghitung ROI selama setahun diberikan oleh: \[ROI = \frac{\textrm{hasil investasi} - \textrm{besar investasi}}{\textrm{besar investasi}} \times 100\%\]
Diberikan tabel besar investasi dan hasil investasi selama setahun untuk 5 buah saham, carilah saham manakah yang paling menguntungkan untuk dilakukan investasi.
Nama Saham Besar Investasi Hasil Investasi BBCA 18,500 22,200 UNVR 25,200 29,500 TLKM 10,000 11,800 PGAS 5,500 7,400 ASII 28,000 32,900 WSKT 16,700 19,300 Selesaikan pencarian saham dengan hasil investasi terbaik menggunakan konsep 2D array, control structure looping, dan array method
.sort()
.