Javascript Array Object Data Transform
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama JavaScript untuk melanjutkan topik lainnya.
Kembali ke rujukan utama JavaScript untuk melanjutkan topik lainnya.
Array dan Object adalah dua struktur data paling dasar di JavaScript. Keduanya dipakai hampir di semua alur aplikasi: dari menyimpan daftar data API, membentuk state UI, sampai menyiapkan payload untuk request.
Walaupun keduanya sama-sama termasuk tipe referensi di JavaScript, cara pakai dan cara transformasinya berbeda. Banyak bug data di JavaScript muncul bukan karena sintaksnya salah, tapi karena struktur yang dipilih tidak sesuai dengan bentuk data yang sedang diproses.
Kalau struktur data dipilih dengan tepat, alur kode biasanya jadi lebih sederhana:
Sebaliknya, kalau array dan object diperlakukan sembarangan, bug yang sering muncul biasanya berupa:
map() atau filter() tidak disimpan kembaliArray adalah daftar terurut. Setiap item punya indeks numerik mulai dari 0.
const users = ['Ayu', 'Bima', 'Citra'];
console.log(users[0]); // Ayu
console.log(users.length); // 3Ciri penting array:
map(), filter(), reduce(), find(), dan sort()Object adalah kumpulan pasangan key-value.
const user = {
id: 1,
name: 'Ayu',
role: 'admin',
};
console.log(user.name); // Ayu
console.log(user['role']); // adminCiri penting object:
| Aspek | Array | Object |
|---|---|---|
| Bentuk utama | urutan item | key-value |
| Cara akses | indeks | key |
| Cocok untuk | daftar, koleksi, sequence | detail, konfigurasi, entity |
| Metode umum | map, filter, reduce | Object.keys, Object.values, Object.entries |
map()map() mengubah setiap item menjadi nilai baru dan menghasilkan array baru.
const prices = [1000, 2000, 3000];
const withTax = prices.map(price => price * 1.11);Pakai map() saat:
filter()filter() mengambil item yang lolos kondisi tertentu.
const activeUsers = users.filter(user => user.active);Pakai filter() saat:
find()find() mencari item pertama yang cocok.
const user = users.find(item => item.id === 3);Pakai find() saat:
reduce()reduce() mengakumulasi array menjadi satu nilai hasil.
const total = prices.reduce((sum, price) => sum + price, 0);Bentuk hasil reduce() bisa berupa:
Pakai reduce() saat:
sort()sort() mengurutkan array secara in-place.
const sorted = [...users].sort((a, b) => a.name.localeCompare(b.name));Catatan penting:
sort() mengubah array asliflat() dan flatMap()flat() meratakan array bertingkatflatMap() menggabungkan transformasi dan perataan satu levelconst nested = [1, [2, 3], [4, [5]]];
const flatOneLevel = nested.flat();Pakai ini saat data datang dalam bentuk nested yang memang perlu diratakan.
Object.keys()Mengembalikan array key enumerable dari object.
const keys = Object.keys(user);Object.values()Mengembalikan array value enumerable.
const values = Object.values(user);Object.entries()Mengembalikan pasangan [key, value].
const entries = Object.entries(user);entries() sering paling enak dipakai kalau object perlu diubah menjadi array untuk diproses dengan map() atau filter().
Object.fromEntries()Mengubah array pasangan [key, value] menjadi object.
const nextUser = Object.fromEntries([
['name', 'Ayu'],
['role', 'editor'],
]);Metode ini sangat berguna saat hasil transformasi array perlu dibentuk lagi menjadi object.
Mutation berarti mengubah data yang sudah ada di tempat yang sama.
const list = [1, 2, 3];
list.push(4); // mutasi
list[0] = 99; // mutasiMutation tidak selalu salah. Dalam konteks lokal yang terkendali, mutation bisa lebih sederhana dan kadang lebih efisien. Tapi mutation jadi berbahaya kalau data itu dibagikan ke banyak bagian program, terutama state UI.
Immutability berarti membuat nilai baru tanpa mengubah data lama.
const list = [1, 2, 3];
const nextList = [...list, 4];Keuntungan immutability:
Waspadai metode yang memodifikasi data langsung:
push(), pop(), shift(), unshift(), splice(), sort(), reverse()Contoh yang sering menjebak:
const state = {
profile: {
name: 'Ayu',
},
};
const nextState = state;
nextState.profile.name = 'Bima';Di atas, nextState dan state menunjuk ke object yang sama. Jadi perubahan pada nextState ikut mengubah state.
const nextList = [...list];
const nextUser = { ...user };Shallow copy hanya menyalin level terluar. Kalau ada nested object/array, referensinya masih dibagi.
Kalau data bertingkat dan memang perlu dipisah total, gunakan pendekatan deep copy yang sesuai konteks. Di browser modern, structuredClone() sering cukup:
const cloned = structuredClone(state);Namun deep copy bukan solusi universal. Pastikan struktur datanya memang cocok dan tidak mengandung nilai yang tidak bisa di-clone dengan cara tersebut.
Banyak pekerjaan JavaScript sebenarnya hanyalah alur transformasi dari array mentah menjadi object yang siap dipakai UI atau API.
Misalnya data API berisi daftar user:
const users = [
{ id: 1, name: 'Ayu', active: true, role: 'admin' },
{ id: 2, name: 'Bima', active: false, role: 'editor' },
{ id: 3, name: 'Citra', active: true, role: 'editor' },
Transformasi yang umum:
filter()map()reduce() atau Object.fromEntries()const activeUsers = users
.filter(user => user.active)
.map(user => ({
id: user.id,
label: `${user.name} (${user.role})`,
}));
Hasil seperti userById sangat berguna kalau akses data lebih sering dilakukan berdasarkan ID daripada urutan.
return di map() atau filter()const result = users.map(user => {
{ id: user.id };
});Karena tidak ada return, hasilnya array berisi undefined.
Perbaikan:
const result = users.map(user => {
return { id: user.id };
});atau singkat:
const result = users.map(user => ({ id: user.id }));map() sama dengan forEach()map() dipakai untuk menghasilkan array baruforEach() dipakai untuk efek sampingKalau hasil array tidak dipakai, biasanya forEach() atau loop biasa lebih tepat.
const next = users;
next.push(newUser);Ini bukan salinan. Keduanya menunjuk ke array yang sama.
const next = { ...state };
next.profile.name = 'Bima';Ini tetap memutasi nested object profile, karena copy-nya hanya shallow.
sort() mengubah array asalKalau array asal masih dipakai di tempat lain, hasilnya bisa bikin UI berubah tanpa disengaja.
Solusi umum:
const sorted = [...items].sort(compareFn);Kalau data memang urut dan sering diiterasi, array biasanya lebih cocok daripada object.
Object lebih cocok saat:
const field = 'name';
console.log(user[field]);Ini valid, tetapi perlu disiplin. Saat key berasal dari input user atau data eksternal, validasi tetap penting.
MapJangan langsung mengubah semua data jadi object kalau akhirnya tetap ditampilkan sebagai list. Pertahankan bentuk data yang paling dekat dengan kebutuhan langkah berikutnya.
Kalau data bertingkat mulai sulit dirawat, pecah menjadi struktur yang lebih flat atau ter-normalisasi. Ini membuat update dan pencarian lebih stabil.
Contoh:
users untuk array useruserById untuk object lookupactiveUsers untuk hasil filterselectedUser untuk satu entitasNama yang konsisten membantu pembaca tahu bentuk datanya tanpa perlu membuka isi variabel.
map() → transformasi itemfilter() → seleksi itemfind() → ambil satu itemreduce() → agregasi / pembentukan struktur barusort() → urutkan data, hati-hati karena in-placeflat() / flatMap() → normalisasi nested arrayObject.keys() → daftar keyObject.values() → daftar valueObject.entries() → pasangan key-valueObject.fromEntries() → ubah pasangan menjadi objectArray dan object bukan sekadar tipe data dasar. Di praktiknya, keduanya adalah alat untuk merancang alur data yang aman, mudah dibaca, dan mudah di-debug.
Kalau kamu bisa menjawab tiga hal ini dengan jelas:
maka sebagian besar bug manipulasi data di JavaScript sudah bisa dicegah sejak awal.