Statistik JS: Chap. 2
2.1. Aritmatika Dasar
Sebelum melangkah jauh ke formula statistik seperti regrasi atau korelasi, ada baiknya kita meninjau balik cara berhitung dasar seperti kabataku (kali, bagi, tambah, kurang). Bila Anda telah biasa dengan formula-formula statistik yang kompleks tersebut, Anda akan cepat sadar bahwa bila semua formula tersebut diurai maka mayoritas operasi matematisnya terdiri dari kabataku dan beberapa lainnya seperti perpangkatan, akar, logaritma, dan operasi minor lainnya. Berhubung kabataku akan sering digunakan pada seluruh formula statistik kedepan, maka penulis mengajak pembaca fokus dulu belajar bagaimana cara melakukan operasi matematika di JS, hingga merancang fungsi yang bisa mengautomasi operasi matematis tersebut.
Spoiler Alert! Bagi pembaca yang tidak punya banyak waktu untuk membaca, lagi malas, atau membalik ke halaman ini lagi sebagai pengingat, inilah daftar fungsi yang akan menjadi hasil akhir bahasan sub-bab ini:
sum = array => array.reduce((acc, inc) => acc + inc)
sub = array => array.reduce((acc, inc) => acc - inc)
mul = array => array.reduce((acc, inc) => acc * inc)
div = array => array.reduce((acc, inc) => acc / inc)
pow = asc => num => Math.pow(num, asc)
Bagi yang ingin belajar fungsi diatas untuk apa, bagaimana cara kerjanya, dan bagaimana mereka dikembangkan, silahkan lanjut baca sub-bab ini.
Seperti yang pernah dijelaskan sebelumnya, Anda dapat melakukan operasi matematika pada baris input console dan memperlakukannya selayaknya kalkulator:
1 + 1 // hasilnya 2
5 - 2 // hasilnya 3
2 * 3 // hasilnya 6
8 / 2 // hasilnya 4
Tapi itu semua masih operasi manual dimana Anda harus mengetikkan sendiri angka berapa saja, dan mereka berinteraksi dengan simbol operasi matematika apa. Kita ingin agar komputer ini menghasilkan angka yang diharapkan cukup dengan menyebutkan ‘mau apa’ dan ‘mana bahannya’. Pada pemrograman dikenal istilah fungsi, yaitu kode komputer berupa persamaan yang dapat menerima parameter (bahan yang akan dihitung) dan badan fungsi dimana logika pengolahan data bekerja:
[ nama ] [ parameter ]
perkalian = (pertama, kedua) =>
logika yang mengembalikan hasil perkalian
[ badan fungsi ]
Inilah konstruksi fungsi yang akan menjadi skema pengembangan semua kode staistik kita kedepannya. Dalam kamus pemrograman JS, fungsi diatas tergolong fungsi murni karena ia tidak mengambil nilai luar manapun selain dari yang kita serahkan melalui parameter. Sedapat mungkin penulisan akan konsisten menggunakan skema fungsi murni ini untuk kesederhanaan proses dan estetik yang elegan.
Bagaimana cara menulis fungsi penambahan? Programmer pemula biasanya akan membuat fungsi seperti ini:
tambah = (a, b) => a + b
tambah(1, 2) // hasilnya 3
tambah(4) // error
tambah(2, 3, 4) // hasilnya 5
Fungsi ini hanya menerima 2 parameter angka, tidak bisa lebih atau kurang, dan akan mengembalikan hasil 1 angka. Bagaimana bila ingin membuat fungsi yang bisa menerima 3 angka? Maka fungsi yang dibuat seperti ini:
penambahanTiga = (a, b, c) => a + b + c
penambahanTiga(1, 2, 3) // hasilnya 6
penambahanTiga(1, 1, 1, 2) // hasilnya 3
penambahanTiga(2, 2) // error
Fungsi diatas harus menerima 3 argumen sekaligus, tidak bisa lebih ataupun kurang. Untuk menangani perhitungan data yang banyak datanya tidak diketahui, skema pengkodean yang kaku seperti diatas tidak akan memberikan solusi. Kita membutuhkan fungsi yang mampu menerima data sependek atau sepanjang apapun.
Dengan paradigma fungsional, kita bisa membuat fungsi yang menerima 1 parameter yang berupa himpunan angka dan menggunakan metode fungsional untuk mengolah himpunan angka tersebut, adapun bentuknya adalah sebagai berikut:
penjumlahan = himpunan => himpunan.reduce(
(saldo, naik) => saldo + naik
)
penjumlahan([1, 2]) // hasilnya 3
penjumlahan([8, 2, 7, 3]) // hasilnya 20
penjumlahan([4]) // hasilnya 4
Kata ‘penjumlahan’ adalah judul fungsinya, dan fungsi ini hanya menerima 1 parameter bernama ‘himpunan’ (karena cuma 1 maka tidak perlu tanda kurung). .reduce
adalah native JS method khusus array (himpunan) yang bisa mereduksi himpunan data dan mengembalikan nilai berdasarkan logika yang dirancang. saldo
adalah nilai yang disimpan oleh komputer sementara untuk diteruskan pada iterasi berikutnya. naik
adalah nilai yang sedang diiterasi oleh komputer pada urutan tertentu untuk dikerjakan bersama dengan nilai saldo
.
Mungkin deskripsi diatas tidak cukup untuk menjelaskan cara kerja reduce
, maka penulis coba bantu dengan narasi sebagai berikut:
- Kita panggil fungsinya dengan perintah
penjumlahan([1, 3, 5])
(1, 3) => 1 + 3 // 4
; komputer mulai dari 1, ambil angka kedua(4, 5) => 4 + 5 // 9
; komputer mulai dari 4, ambil angka ketiga- Komputer mendeteksi bahwa semua anggota himpunan telah diiterasi dan siap untuk mengembalikan hasil yang tersisa dan ditampilkan di daftar log pada panel console.
Bila berdasarkan narasi diatas belum paham juga, coba search video YouTube ‘how JS reduce method works’. Jika penulis bisa maka pembaca juga pasti bisa.
Did You Know?:
reduce
memiliki beberapa saudara yang cara kerjanya sama tapi untuk berbeda tujuan, sepertimap
,find
, danfilter
. Mereka tidak hanya bisa memanipulasi himpunan angka tapi juga teks dan objek. Tapi untuk keperluan buku statistik ini reduce dan map juga sudah cukup.
Sekarang mari kita berkenalan dengan metode map
. Pada aplikasi spreadsheet seperti M. Excel mungkin Anda telah terbiasa dengan menjejerkan himpunan angka pada 1 kolom dan banyak baris, mengetikkan formula pada kolom sebelahnya dengan menunjukkan kolom pertama sebagai sumber data, dan menyalin formula tersebut pada kolom kedua hingga sebanyak baris pada kolom pertama. Di JS kita tidak akan melakukan itu karena metode map
adalah fungsi yang bisa memanipulasi nilai himpunan tanpa perlu menyimpan himpunan awal sebelum dimanipulasi. Hal ini memberikan keuntungan bagi komputer karena penggunaan memori bisa lebih dihemat dan data bisa dialirkan kepada fungsi yang lain atau langsung dikembalikan sebagai hasil.
Seperti cara sebelumnya, penulis akan mencoba menjelaskan bagaimana cara metode map
bekerja. Anggap kita memiliki himpunan angka [2, 3, 4]
dan kita ingin mengubah setiap anggota atau elemen himpunan tersebut menjadi hasil pangkat-duanya [4, 9, 16]
. Kode perintahnya adalah:
[2, 3, 4].map(i => i * i) // hasilnya [4, 9, 16]
Dimana i
adalah anggota himpunan yang sedang diiterasi oleh metode. Cara kerjanya jauh lebih sederhana dibanding meode rreduce
kan? Berhubung di awal sub-bab tadi penulis juga sudah menyiapkan fungsi perpangkatan pow
, maka juga bisa kita manfaatkan untuk mendapatan hasil yang sama dengan kode yang tampil lebih elegan, seperti:
[2, 3, 4].map(pow(2)) // hasilnya [4, 9, 16]
Bagaimana dengan operasi pengakaran? Dalam operasi matematika, pengakaran adalah sama dengan operasi perpangkatan, dimana faktor pangkatnya adalah 1 per sekian. Maka dalam hal ini operasi pengakaran pada JS dapat dilakukan seperti pada kode berikut:
[89, 64, 25].map(pow(1/2)) // hasilnya [9, 8, 5]
Dalam pengkodean, programmer dibebaskan untuk memilih/merancang sendiri label nama untuk variabel, fungsi, properti objek, parameter, dan sebagainya. Sebagai contoh, untuk menjelaskan konsep metode .reduce
tadi penulis menggunakan kata penjumlahan sebagai judul fungsi sementara pada halaman awal sub-bab tadi menggunakan sum
sebagai singkatan summary. Begitu pula dengan sub
yang singkatan dari 'substraction' untuk pengurangan, mul
singkatan dari 'multiplication' untuk perkalian, div
singkatan dari 'division' untuk pembagian, dan pow
singkatan dari 'power' untuk perpangkatan atau pengakaran, begitu pula antara istilah 'array' dan himpunan. Pembaca dipersilahkan untuk bereksperimen dengan istilah lain yang relevan atau membahasa-Indonesiakan semuanya. Karena menurut W. Shakespear 'apalah arti sebuah nama'.
Praktik Mandiri
Coba Anda masukkan fungsi sum
, sub
, mul
, div
, pow
,ke baris input console dan eksekusi dengan perintah:
add([1, 2, 3, 4, 5]) // pastikan hasilnya 15
sub([100, 20, 15, 25]) // pastikan hasilnya 40
mul([2, 4, 6]) // pastikan hasilnya 40
pow(3)(2) // pastikan hasilnya 8
pow(1/2)(14) // pastikan hasilnya 4
[5, 6, 7].map(pow(2)) // pastikan hasilnya [25, 36, 49]
Bila muncul hasil yang tidak sama atau bahkan error, coba lagi sampai berhasil. Silahkan bereksperimen dengan menggonta-ganti angkanya. Anda dapat dianggap berhasil bila pengetikan fungsi tersebut sudah diluar kepala. Ada baiknya juga membuka aplikasi Notepad atau semacamnya dan mem-backup fungsi-fungsi tersebut dalam file format .txt, karena browser akan melupakan semua yang anda inputkan ketika Anda close tab atau exit browser.
2.2. Fungsi Logika
Bagian ini sebenarnya tidak terkait langsung dengan bahasan di mayoritas buku statistik, tapi menurut penulis penting sekali untuk dibahas karena beberapa atau bahkan kebanyakan formula statistik kedepan akan membutuhkannya. Baik, lalu apa itu fungsi logika? Beberapa ahli berpendapat bahwa statistik adalah turunan matematika, dan matematika adalah turunan logika. Penulis tidak ingin terlalu dalam membahas logika hingga filsafatnya dalam buku yang relatif kecil ini dan hanya akan melibatkan logika dalam pengertian pengkodean fungsi saja.
Di dalam ilmu pemrograman kita bisa mengatur aliran logikanya dengan konsep ‘jika ini maka itu, atau bila tidak ini maka itu yang lain’. Hampir seluruh software yang ada di dunia dan yang Anda gunakan sekarang terdiri dari rantaian ‘jika ini maka itu’ yang sangat panjang, hingga menjadi software yang Anda pakai. Dalam pemrograman konvensional atau yang berparadigma prosedural atau imperatif, konsep ‘jika ini maka itu’ dikenal dengan istilah ‘conditional statement’, yaitu suatu set perintah yang hanya akan dilaksanakan komputer bila kondisi yang disyaratkan terpenuhi.
Spoiler Alert!: Ini adalah daftar fungsi yang akan menjadi hasil akhir bahasan sub-bab ini:
ors = array => array.find(Boolean)
ands = array => array.reduce((acc, inc) => acc && inc, true)
Selain ‘if statement’ ada ‘else-if’, ‘while-do’, ‘switch statement’, yang ketiganya bisa Anda pelajari sendiri melalui artikel atau tutorial YouTube. Sementara pada paradigma fungsional logika ‘jika ini maka itu’ konsepnya tidak dijawab dengan ‘conditional statement’ melainkan dengan alternatif lain seperti ‘ternary’, ‘short circuit’, atau seperti yang telah dicantumkan pada bagian spoiler, fungsi yang memanfaatkan ‘native array method’. Penulis sangat menyarankan pembaca untuk mencermati penjelasan cara kerja sintaks berikut ini karena akan sering digunakan pada banyak fungsi kedepannya.
2.1.1. Ternary
‘If statement’ ketika dieksekusi maka ia akan menguji kondisi yang disyaratkan dan bila benar maka ia akan menjalankan suatu perintah, termasuk diantaranya mengubah nilai pada variabel yang diluar ‘if-statement’ tersebut. Sifat mutatif ‘if-statement’ inilah yang bertentangan dengan prinsip ‘immutability’yang dipegang oleh paradigma fungsional. Alternatif langsung dari ‘if-statement’ ini dalam paradigma fungsional adalah ternary, yang istilah teknisnya tergolong ‘conditional expression’. Disebut expression karena ternary ketika dieksekusi akan langsung mengembalikan nilai dan tidak normal bila digunakan untuk mengerjakan hal lain diluar ekspresi tersebut. Berikut ini adalah bentuk dan cara kerja ekspresi ternary:
(1 + 1) === (4 / 2) ? 'betul' : 'salah'
[ part 1 ] [part2] [part3]
Part 1 adalah pernyataan yang akan diuji kebenarannya, kemungkinannya hanya ada 2 yaitu benar atau salah. Dalam contoh ini diuji pernyataan ‘apakah benar 1+1 sama dengan 4/2?’ Karena jawabanannya benar, maka ternary akan mengembalikan Part 2 sebagai hasil. Sementara bila Part 1-nya diganti dengan 1===2 (salah) maka nilai yang akan dikembalikan adalah yang ada di Part 3.
2.1.2. Short Circuit
Jika diartikan ke bahasa Indonesia secara langsung artinya adalah arus pendek atau konslet. Meski istilahnya terdengar aneh tapi cara kerjanya hampir sama dengan namanya. Short Circuit (SC) adalah ekspresi yang dapat kita gunakan untuk menyerahkan suatu nilai berdasarkan kondisi [atau / dan]. Langsung saja kita contohkan seperti ini:
true || true // hasilnya true
true || false // hasilnya true
false || true // hasilnya true
false || false // hasilnya false
Simbol garis vertikal ganda adalah untuk mewakili logika ‘atau’. Artinya ekspresi akan mengembalikan nilai yang benar pertama bila salah satu bernilai benar.
true && true // hasilnya true
true && false // hasilnya false
false && true // hasilnya false
false && false // hasilnya false
Simbol ‘dan’ ganda adalah untuk mewakili logka ‘dan’. Artinya ekspresi akan mengembalikan nilai akhir hanya bila pasangan yang diuji keduanya bernilai benar.
Kedepannya SC akan digunakan untuk fungsi logika dengan cara seperti berikut ini:
2 * 3 || 1 - 1 // hasilnya 6
2 * 3 || 1 + 1 // hasilnya 6
2 * 3 && 1 - 1 // hasilnya false
2 * 3 && 1 + 1 // hasilnya 2
1 + 1 && 2 * 3 // hasilnya 6
Coba cermati bahwa SC ‘dan’ akan selalu mengembalikan yang terakhir diantara sepasang nilai ‘benar’. Sementara SC ‘atau’ akan selalu mengembalikan nilai ‘benar’ pertama diantara yang sepasang. Perlu diperhatikan bahwa hal yang dianggap setara sebagai salah bagi komputer adalah yang bernilai false, 0, null, undefined, dan NaN sementara selebihnya dianggap setara dengan benar.
2.1.3. Negation
Dalam percakapan sehari-hari kita sering menyatakan ‘kalau tidak salah berarti benar’, begitu juga sebaliknya ‘kalau tidak benar berarti salah’. Benar dan salah akan selalu berada pada kutub yang berbeda layaknya positif dan negatif atau antara utara dan selatan, atau pria dan wanita (Joke: bagi yang masih ragu, segera hubungi dokter).
Dalam pemrograman, konsep ‘kalau tidak salah’ ini diberi istilah negation (negasi). Ekspresi negasi akan selalu membalikkan poros salah-benar atas nilai apapun yang ada di hadapannya dan mengambalikan nilai salah atau benar. Contohnya adalah sebagai berikut:
!true // hasilnya false
!false // hasilnya true
!5 // hasilnya false
!0 // hasilnya true
!!true // hasilnya true
!!!false // hasilnya true
!!5 // hasilnya true
!!0 // hasilnya false
!!'love' // hasilnya true
!'love' // hasilnya false
2.1.4. ORs dan ANDs
Bagaimana jika kita memiliki banyak argumen yang ingin diuji kebenarannya dan kembalikan salah satu yang bernilai benar? Pada paradigma prosedural/imperatif normalnya akan digunakan rantaian ‘if-else-if-else’ yang panjang atau ‘switch statement’. Dalam paradigma fungsional, yang akan kita gunakan adalah ‘native array method’ seperti .find
dan .reduce
. Seperti yang telah ditunjukkan di awal sub-bab, penulis telah mengembangkan 2 buah fungsi logka yang diberi nama ors
dan ands
dengan kegunaan dan cara kerja sebagai berikut:
ORs
ors = array => array.find(Boolean)
Adalah fungsi yang ketika diberikan himpunan argumen maka setiap argumen tersebut akan diuji kebenarannya secara berurutan dan akan mengembalikan argumen pertama yang bernilai setara dengan benar. Contoh:
ors([ // setiap argumen dipisah/diakhiri tanda koma
!true, // kebalikan dari benar ya salah
2 * 2, // hasilnya 4
'cinta'.length // kata 'cinta' terdiri dari 5 huruf
]) // hasil yang dikembalikan adalah angka 4
Dari himpunan argumen yang digunakan terdapat 2 jawaban yang setara benar yaitu 4 dan 5. Yang dikembalikan hanya nilai yang pertama benar. Kenapa penulis berikan nama ors
? Karena ors
terdiri dari kata or
dan imbuhan s
yang berarti logika 'atau' yang majemuk.
ANDs
Adalah fungsi yang ketika diberikan himpunan yang argumen maka setiap argumen tersebut akan diuji kebenarannya, dan hanya akan mengembalikan nilai terakhir bila semuanya setara dengan benar. Contoh:
ands([
!false, // kebalikan dari salah ya benar
2 * 2, // hasilnya 4
'cinta'.length // hasilnya 5
]) // hasilnya 5
Harap maklum bila dari tadi hanya kata ‘cinta’ yang terfikir oleh penulis. Walau demikian penulis berharap keterangannya cukup jelas. Sementara bila pada salah satu saja dari argumen tersebut diganti ke suatu nilai setara ‘salah’ maka fungsi akan mengembalikan false. Kenapa penulis berikan nama ands
? Karena terdiri dari kata and
dan imbunan s
yang menandakan logikan 'dan' yang majemuk.
Info: bermodal fungsi logika ORs dan ANDs penulis telah berhasil mengembangkan aplikasi berskala besar seperti Sistem Informasi Manajemen Rumah Sakit (SIMRS.dev) Terintegrasi yang didalamnya tidak mengandung satupun ‘if-else’ statement. Kedua formula ini ckup generik sehingga bisa dimanfaatkan untuk pengembangan berbagai aplikasi termasuk salah satunya statistik.
Praktik Mandiri
Berdasarkan penjelasan dan contoh yang telah diberikan, coba Anda karang sendiri skenario logika untuk ternary, short circuit, negation, ORs dan ANDs. Setidaknya Anda buat 3 contoh kasus untuk masing-masing teknik dan upayakan contohnya unik semua. Silahkan bereksperimen dengan menggabungkan beberapa teknik dalam 1 perintah atau fungsi agar Anda mengetahui apa saja yang bisa dilakukan dengan teknik-teknik tadi dan apa yang tidak. Anda dapat digolongkan paham bila Anda mengetahui hasil apa yang akan keluar bahkan sebelum perintah/ekspresi/fungsi tersebut dieksekusi.
2.3. Struktur Data
Dalam dunia pemrograman, jenis struktur data ada banyak sekali, mulai dari yang paling sederhana seperti himpunan (array) hingga yang lumayan kompleks seperti blockchain yang umum digunakan pada Bitcoin dan lainnya. Dua jenis struktur data yang paling umum dan akan sering kita gunakan dalam buku ini adalah array dan objek. Pada beberapa sub-bab sebelumnya penulis telah mencoba mengakrabkan pembaca dengan himpunan, tapi pengetahuan tentang himpunan asih jauh lebih luas dari itu, bukan berarti rumit ya. Penulis juga belum memperkenalkan temannya yang bernama objek yang cara kerjanya lumayan berbeda dari himpunan. Mari kita bahas satu per satu secara lengkap (sesuai kebutuhan buku saja ya):
2.3.1. Array
Seperti yang telah sering ditunjukkan sebelumnya, bahwa himpunan adalah sederet nilai yang dikumpulkan dalam tanda kurung siku (brackets). Disini kata kunci ‘sederet’ adalah komponen yang paling penting karena meski bila ada 2 himpunan yang mengandung nilai sama dengan urutan berbeda maka komputer tetap menganggapnya berbeda. Contoh:
['a', 'b'] !== ['b', 'a']
Sekarang bahas tentang nilai apa saja yang bisa dijadikan anggota himpunan. Seperti yang telah ditunjukkan sebelumnya bahwa angka dan huruf, boolean (true/false) dapat dijadikan anggota himpunan, begitu pula kepada array dan objek. Bahkan anggota himpunan boleh saja terdiri dari jenis nilai yang berbeda-beda. Ada juga multidimensional array, yaitu array yang megnandung array lagi di dalamnya. Langsung kita tampilkan saja contohnya:
[1, 2, 3, 4] // himpunan angka
['riky', 'rafi', 'rani', 'bibi'] // himpunan teks
['satu', 2, 'tiga', 4] // himpunan campuran
[[1, 2], [3, 4]] // multidimensional array, seperti matrix
Indexing
Berhubung nilai-nilai di dalam himpunan merupakan deret yang berurutan maka kita bisa mengaksesnya dengan mudah melalui angka indeks mulai dari 0 hingga elemen terakhir. Kenapa mulai dari 0 dan tidak 1 saja? Semua yang belajar pemrograman pasti pernah menanyakan ini dan kurang lebih karena ketetapan bersama yang telah menjadi tradisi. Contoh:
huruf = ['a', 'b', 'c', 'd', 'e', 'f']
huruf[0] // dapat 'a'
huruf[2] // dapat 'c'
Slicing
Bagaimana jika ingin mengambil sebagian elemen dari urutan sekian ke urutan sekian? Kita bisa gunakan slice method dengan contoh seperti ini:
huruf.slice(0, 2) // dapat ['a', 'b', 'c']
huruf.slice(1, 3) // dapat ['b', 'c', 'd']
huruf.slice(4) // dapat ['e', 'f']
Sorting
Sering kali kdata yang dikumpulkan di lapangan tidak tersusun berurut dalam himpunan, dan mengerjakannya secara manual akan sangat melelahkan bila dalam jumlah banyak, lebih baik bila komputer saja yang mengerjakannya. Tapi bagaimana?
Contoh: [45, 98, 72, 56, 68] adalah himpunan berat badan mahasiswa/i yang diambil secara acak, dalam JS cara pengurutannya adalah:
daftarBerat = [45, 98, 72, 56, 68]
daftarBerat.sort((a, b) => a - b)
// berurut mendaki [45, 56, 68, 72, 98]
daftarBerat.sort((a, b) => b - a)
// berurut menurun [98, 72, 68, 56, 45]
// maka fungsi yg akan sering dipakai nanti
sort = array => array.sort((a, b) => a - b)
Bagi yang berminat untuk tahu lebih jauh tentang sorting ini silahkan googling ‘sorting algorithm’
Length
Untuk mengetahui berapa panjang himpunan, kita bisa gunakan .length
pada himpunan manapun. Contoh:
huruf.length // hasilnya 6
beratBadan.length // hasilnya 5
[1, 2, 3, 4].length // hasilnya 4
Spread
Bila ingin menggabungkan 2 atau lebih himpunan menjadi 1 himpunan saja maka bisa gunakan sintaks ...
(spread, titik tiga) di dalam himpunan yang baru. Contoh:
satuketiga = [1, 2, 3]
empatkeenam = [4, 5, 6]
satukeenam = [...satuketiga, ...empatkeenam]
satukeenam // hasilnya [1, 2, 3, 4, 5, 6]
2.3.2. Objek
Adalah struktur data yang merupakan kumpulan pasangan kunci dan nilai, dimana setiap kunci adalah unik. Urutan pasangan di dalam objek tidak diperhitungkan oleh komputer. Cara penulisan objek adalah sebagai berikut {a: 12, b: 25, c: 46}
. Lihat bahwa tanda kurung yang digunakan adalah kurung kurawal (curly brackets). Jika kita memaksakan untuk menambahkan a: 5
pada objek tersebut maka komputer akan menggantinya dengan pasangan yang terbaru atau dalam kasus software menjadi laporan error.
Anda boleh menggunakan kata, angka, kata+angka sebagai label kunci dan boleh menggunakan data apa saja sebagai nilainya. Contoh:
{
nama: 'Udin Sedunia',
alamat: 'Pulo Gadung',
alamat2: 'cihampelas',
anak: ['sugeng', 'ipeh'],
ortu: {
ayah: 'midun',
ibu: 'inem'
}
}
Dapat dilihat disini bahwa data yang bisa dikandung sebuah objek dapat beragam dan bisa sesederhana atau sekompleks apapun sesuai kebutuhan.
Praktik Mandiri
Berdasarkan apa yang telah dipelajari tentang himpunan, coba:
- Buat daftar angka (kalau bisa panjang dan acak)
- Coba ambil salah satu elemen dengan berdasarkan indeks
- Ambil sebagian isi himpunan dengan
.slice
- Coba gabungkan beberapa himpunan menjadi satu
- Coba buat berurutan mendaki, dan berurut menurun
- Hitung panjang himpunan dengan
.length
Berdasarkan apa yang telah dipelajari tentang objek, coba buat daftar riwayat hidup/biodata lengkap dalam struktur objek. Buatlah selengkap atau sekompleks yang Anda bisa bayangkan. Anda dapat dikatakan mahir bila nanti sudah terbiasa memandang atau menilai masalah atau hal-hal diluar sana secara abstrak dalam bentuk himpunan, objek, atau kombinasi keduanya.
2.4. Fungsi Pendukung
Dalam sub-bab ini kita akan membahas beberapa fungsi pendukung yang tidak berkaitan langsung dengan tema statistik namun dianggap penting oleh penulis untuk dijelaskan kepada pembaca karena fungsi yang akan dijelaskan akan sering dipakai pada pengembangan kode statistik kedepan. Hal yang akan dibahas adalah withAs
dan recursion.
WithAs
Ini adalah fungsi yang penulis kembangkan sendiri untuk membantu fungsi menjalankan kode secara murni dengan ekspresi dan tanpa sintaks apapun yang tergolong statement. Bila kalimat diatas terdengar cukup rumit, mari penulis bantu jelaskan bertahap dan perlahan. Menurut Grifsky (2020), expression dan statement dapat dibedakan dari cara komputer mengevaluasi kode yang ditulis oleh programmer. Statement adalah perintah kepada komputer untuk melakukan sesuatu, sementara ekspresi adalah perintah kepada komputer untuk memberikan sesuatu. Mungkin lebih mudah lagi bila dengan contoh perbandingan berikut:
a. Penjumlahan ala prosedural
himpunan = [1, 2, 3, 4, 5]; // himpunan yang akan ditotal
total = 0; // ini variabel untuk menghimpun nilai total
for(i = 0; himpunan.length; i++){ // teli himpunan 1per1
total = total + i; // ubahkan nilai var total
}
Skarang pada variabel total berubah menjadi 15 yang bisa dipanggil dengan ketik total
lalu Enter. Terlihat disini bahwa for loop
statement tugasnya adalah untuk mengubah nilai yang sudah ada bukan untuk mengembalikan nilai secara langsung. Cara mudah membacanya "hey komputer, buatkan sebuah variabel baru bernama total dengan nilai 0. Coba diiterasi satu per satu isi variabel himpunan, untuk setiap nilai yang didapat tambahkan ke nilai total ya."
b. Penjumlahan ala fungsional
sum = array => array.reduce((saldo, naik) => saldo + naik)
// fungsi penjumlah
himpunan = [1, 2, 3, 4, 5] // yang akan dijumlahkan
sum(himpunan) // hasilnya 15
Disini komputer tidak diminta untuk mengubah nilai apapun, melainkan memberikan hasil perhitungan yang diminta. Cara mudah membacanya “hey fungsi penjumlahan, ada himpunan nih, hitung dan langsung kembalikan hasilnya ya.”
Bagaimana cara menulis fungsi secara konvensional menurut JS versi yang lama? Seperti ini:
function plusTwo(number){
var result = number + 2;
return result;
}
Kode diatas terlihat cukup ribet walau hanya untuk pekerjaan yang sangat sederhana. Dengan menggunakan sintaks fungsi pada JS versi terbaru, cukup dengan kode seperti ini:
plusTwo = number => number + 2
Kembali tentang withAs
tadi, fungsi ini akan mengizinkan programmernya untuk menulis fungsi panah khas JS '=>' tanpa perlu menggunakan statement atau variabel pada bagian body. Contohnya seperti pada kode formula median pada bab berikutnya.
Rekursi
Adalah fungsi ang dalam ekspresinya dapat memanggil dirinya sendiri. Penjelasannya memang singkat tapi memahaminya relatif rumit. Mungkin pembaca semua masih ingat tentang faktorial seperti !5 yang terdiri dari 1 * 2 * 3 * 4 * 5 = 120. Para programmer prosedural umumnya akan mengerjakan dengan cara seperti ini:
function faktorial(angka){
var total = 1; // buat dulu tempat simpan jumlahnya
for(i = 0; angka.length; i++){ // perintah pengulangan
total = total * i; // kalikan nilai total sementara
}; // dengan nilai pengulangan
return total; // kalau habis, kembalikan hasil
}
faktorial(5) // dapat 120
Sementara programmer fungsional akan mengerjakannya seperti ini:
faktorial = angka =>
angka === 1 ? 1 : angka * faktorial(angka - 1)
faktorial(5) // dapat 120
Apa?? Kok bisa lebih singkat? Begini penjelasannya:
Ketika fungsi faktorial pertama kali menerima angka 5, ekspresi ternary akan tanya apakah angka yang diterima bernilai 1? Karena tidak, maka lanjut hitung 5 dikali faktorial 5 dikurangi 1. Pada momen inilah terjadi pengulangan faktorial 4 dan menjalani pula proses yang dilalui oleh faktorial 5 tadi. Pengulangan ini terus berlanjut pada faktorial 3 dan 2. Hal yang berbeda terjadi ketika faktorial(1) dipanggil, ekspresi akan stop pengulangan dan mengembalikan angka 1 sebagai penutup. Ketika semua kalkulasi dirunut serentak maka fungsi akan bekerja seperti ini: 5 * (4 * ( 3 * (2 * 1))) dan menghasilkan 120. Inilah salah satu alasan mengapa penulis sangat menyukai paradigma fungsional, karena ia mengajak programmer untuk membuat solusi yang sederhana, singkat, dan out-of-the-box. Semoga pembaca juga tertarik.