Array pada JavaScript adalah benda yang sangat menarik. Selain karena bisa menyimpan elemen-elemen dengan tipe data apapun, undefined sekalipun, juga karena Array memiliki banyak metode-metode menarik pada prototipenya yang bisa digunakan dalam berbagai situasi. Metode-metode tersebut disematkan pada prototipe objek Array sehingga dapat langsung digunakan setelah notasi literal Array, [].indexOf() misalnya.

Metode-metode yang disematkan pada prototipe Array tersebut dinamakan, coba tebak... ya, benar, Array prototype methods. Jika Anda sehari-hari menulis program JavaScript, kemungkinan besar Anda pernah berjumpa dengan beberapa metode tersebut, misalnya map, filter, reduce, atau find. Tapi apakah Anda tahu bahwa metode prototipe Array ada lebih banyak dari itu? Mari kita bahas beberapa metode yang menarik, yang relatif lebih jarang ditemui sehari-hari.

Unshift

Anda mungkin sudah kenal baik dengan push yang menambahkan elemen baru ke dalam sebuah Array. unshift juga berfungsi menambahkan elemen ke dalam sebuah Array. Perbedaannya, jika push menambahkan elemen baru di ujung, unshift menambahkan elemen baru di awal Array.

const arr = [1, 2, 3];
arr.unshift(4); // 4
console.log(arr); // [4, 1, 2, 3]

Salah satu kegunaan metode unshift adalah membuat Array dengan sistem akses first-in first out (FIFO) seperti antrean, dengan mengombinasikannya dengan pop.

const queue = [];
queue.unshift(1);
queue.unshift(2);
queue.unshift(3);

const item = queue.pop(); // 1

console.log(queue); // [3, 2]

Shift

Ada unshift, ada juga shift. Jika unshift digunakan untuk menambahkan elemen, shift digunakan untuk mengambil elemen seperti pop, perbedaannya shift mengambil elemen terdepan suatu Array sementara pop mengambil elemen terujung.

const arr = [1, 2, 3, 4, 5];
const firstEl = arr.shift(); // 1

console.log(arr); // [2, 3, 4, 5]

Bisa dibilang, duo unshift-shift adalah padanan dari push-pop yang memiliki arah terbalik.

Includes

Memeriksa keberadaan elemen dalam Array adalah kasus yang sangat umum. Sebelum ES6, cara untuk melakukannya adalah dengan metode indexOf yang mengembalikan indeks elemen yang dicari, atau -1 jika elemen tidak ditemukan.

['a', 'b', 'c', 'd'].indexOf('b') > -1; // true

ES6 mengenalkan cara baru yang lebih mudah dibaca untuk memastikan keberadaan elemen dalam Array, yaitu includes yang mengembalikan true jika elemen ditemukan di dalam Array.

['a', 'b', 'c', 'd', 'e'].includes('b'); // true

Terdapat beberapa perbedaan antara metode indexOf dan includes, di antaranya:

Mencari keberadaan nilai NaN

Metode indexOf melakukan perbandingan menggunakan strict equality, dan dalam JavaScript NaN !== NaN, sehingga indexOf tidak akan menemukan nilai NaN. Di sisi lain, includes dapat menemukan nilai NaN.

const arr = [NaN, 0, 1, 2];

arr.indexOf(NaN) > -1; // false
arr.includes(NaN); // true

Mencari keberadaan slot kosong

Array dalam JavaScript bisa memiliki slot kosong, bukan undefined maupun null, benar-benar kosong tidak bernilai apapun. Ada beberapa cara membuat Array berslot kosong, misalnya dengan menggunakan konstruktor Array, new Array(5) misalnya; mengubah length suatu Array melebihi elemen yang dimilikinya, [1, 2, 3].length = 5 misalnya; atau, tidak memasukkan elemen apapun ketika diinisiasi, [,,,] misalnya.

Metode indexOf akan melewati slot-slot kosong dalam Array, sehingga kita tidak bisa menemukannya dengan indexOf. Tetapi, metode includes menyamakan slot kosong dengan undefined, jadi kita bisa menemukannya dengan memasukkan undefined sebagai parameter.

const arr = [, , , ,];

arr.indexOf(); // -1
arr.indexOf(undefined); // -1

arr.includes(); // true
arr.includes(undefined); // true

Find Index

Array memiliki metode findIndex. Sekilas mirip indexOf, bukan? Keluaran kedua metode tersebut sama, indeks elemen yang dicari.

Perbedaannya, jika indexOf menerima parameter berupa nilai, findIndex menerima parameter berupa fungsi. Baik indexOf maupun findIndex mengembalikan indeks elemen pertama dari awal Array yang ditemukan sesuai dengan kriteria pencarian.

Metode findIndex mengembalikan indeks elemen jika fungsi callback yang kita berikan mengeluarkan nilai truthy terhadap elemen tersebut.

const members = [
  { name: 'Sowon', position: 'leader' },
  { name: 'Yerin', position: 'dancer' },
  { name: 'Eunha', position: 'vocal' },
  { name: 'Yuju', position: 'vocal' },
  { name: 'SinB', position: 'dancer' },
  { name: 'Umji', position: 'maknae' }
];

const searchFn = member => member.position === 'vocal';

members.findIndex(searchFn); // 2

Fungsi pencarian dapat memiliki tiga parameter, parameter-parameter tersebut secara berurutan adalah:

  • Elemen dalam proses iterasi
  • Indeks dalam proses iterasi
  • Referensi terhadap Array yang diproses

Last Index Of

Masih seputar indeks, selain indexOf, Array juga memiliki lastIndexOf. Metode lastIndexOf identik dengan indexOf dalam semua hal, kecuali arah pencariannya: lastIndexOf mencari indeks elemen dari elemen terakhir hingga ke elemen pertama.

const arr = ['a', 'b', 'b', 'a'];

arr.indexOf('b'); // 1
arr.lastIndexOf('b'); // 2

Seperti indexOf, lastIndexOf juga menerima parameter kedua bertipe Number yang menentukan indeks mulai pencarian. Indeks mulai ini bersifat inklusif, jadi jika elemen yang dicari ditemukan pada indeks mulai, maka indeks mulai akan dikembalikan.

const arr = ['a', 'b', 'b', 'a'];

arr.indexOf('b', 2); // 2
arr.lastIndexOf('b', 1); // 1

Some & Every

Kita sudah berkenalan dengan metode includes yang mencari keberadaan elemen dalam suatu Array. Selain includes, ada juga metode some dan every yang memeriksa keberadaan suatu elemen. Perbedaan mendasar antara some dan every dengan includes adalah, some dan every menerima parameter pencarian berupa fungsi, sementara includes menerima parameter nilai.

Perbedaan antara some dan every sendiri adalah, some mengembalikan true ketika fungsi pencarian mengembalikan nilai truthy pada setidaknya satu elemen dalam Array, sementara every baru mengembalikan true ketika hal yang sama terjadi pada setiap elemen dalam Array.

const arr = [1, 2, 3, 4, 5];

arr.some(el => el > 3); // true
arr.every(el => el > 3); // false

Bisa ditebak, metode some akan langsung keluar ketika fungsi pencarian mengembalikan true, sementara every akan mengevaluasi Array hingga akhir karena harus memastikan semua nilai memenuhi kriteria.

Fungsi pencarian yang diterima some dan every memiliki spesifikasi yang sama dengan fungsi pencarian findIndex, yaitu memiliki tiga parameter: elemen, indeks, dan referensi terhadap Array.

Reduce Right

Salah satu fungsi paling populer dalam Array Prototype Methods adalah reduce. Tetapi, tahukah Anda bahwa reduce memiliki saudara, yaitu reduceRight yang melakukan operasi reduce dari akhir hingga awal Array? Selain arah operasinya, reduceRight memiliki spesifikasi yang identik dengan reduce.

// Mengembalikan 'noon'
['n', 'o', 'o', 'n'].reduce((accumulator, current) => accumulator + current);

// Mengembalikan 'noon'... sebentar, ini bukan contoh yang baik
['n', 'o', 'o', 'n'].reduceRight((accumulator, current) => accumulator + current);

// Mohon maaf, ini baru contoh yang benar hehe =====================

// Mengembalikan 'abc'
['a', 'b', 'c'].reduce((accumulator, current) => accumulator + current);

// Mengembalikan 'cba'
['a', 'b', 'c'].reduceRight((accumulator, current) => accumulator + current);

Selain metode-metode tersebut, masih banyak metode lain yang dimiliki Array dalam prototype-nya. Silakan kunjungi dokumentasi di MDN untuk melihat daftar lebih lengkapnya. Tiga metode sengaja tidak saya cantumkan di sini, yaitu map, filter, dan reduce karena saya rasa mereka perlu diulas dalam artikel tersendiri.

Referensi
Array - Javascript | MDN
Difference Between indexOf and findIndex function of array | StackOverflow