Roblox
Belajar Luau 05: Table sebagai Array dan Dictionary
Menyimpan banyak nilai dalam satu variabel dengan table Luau: array, dictionary, table bersarang, ipairs dan pairs, table.sort, serta jebakan referensi yang sering membuat bug.

Table adalah satu variabel yang bisa menyimpan banyak nilai. Di Luau, table adalah satu-satunya struktur data, dan dipakai untuk hampir semua hal: inventory, daftar pemain, data toko, sampai data yang disimpan permanen.
Jalankan di terminal:
luau 05-table.luau
Yang akan dipelajari
- Array: daftar berurutan, index mulai dari 1
table.insert,table.remove,table.find,table.sort,table.concat- Dictionary: pasangan kunci = nilai
- Loop dengan
ipairsdanpairs - Table di dalam table
- Jebakan referensi dan
table.clone
Bagian A: array
Membuat dan mengakses array
Array dibuat dengan kurung kurawal { }. Isinya diakses dengan nomor urut (index). Penting: di Luau index dimulai dari 1, bukan 0.
local inventory = {"Pedang", "Perisai", "Ramuan"}
print(inventory[1]) -- Pedang
print(inventory[3]) -- Ramuan
print(inventory[10]) -- nil (tidak ada)
print("Jumlah item:", #inventory) -- 3
Mengubah, menambah, dan menghapus
inventory[2] = "Perisai Emas"
print(inventory[2])
table.insert(inventory, "Busur") -- tambah di akhir
table.insert(inventory, 1, "Helm") -- sisipkan di posisi 1
print(table.concat(inventory, ", ")) -- gabung jadi satu teks
-- Helm, Pedang, Perisai Emas, Ramuan, Busur
table.remove menghapus isi, dan isi sesudahnya otomatis bergeser:
local dibuang = table.remove(inventory, 1) -- hapus posisi 1
print("Dibuang:", dibuang) -- Helm
table.remove(inventory) -- tanpa posisi = hapus yang terakhir
print(table.concat(inventory, ", ")) -- Pedang, Perisai Emas, Ramuan
Mencari isi
table.find mengembalikan posisi isi, atau nil kalau tidak ada:
print(table.find(inventory, "Ramuan")) -- 3
print(table.find(inventory, "Kapak")) -- nil
if table.find(inventory, "Pedang") then
print("Kamu punya pedang")
end
Loop dengan ipairs
ipairs memberikan posisi dan isinya, berurutan. Kalau posisinya tidak dibutuhkan, pakai _ yang artinya "abaikan".
for i, item in ipairs(inventory) do
print(`Slot {i}: {item}`)
end
for _, item in ipairs(inventory) do
print("-", item)
end
Mengurutkan
local skor = {450, 120, 980, 300}
table.sort(skor) -- kecil ke besar
print(table.concat(skor, ", ")) -- 120, 300, 450, 980
Untuk urutan lain, berikan function pembanding. Ingat callback dari pelajaran 04:
table.sort(skor, function(a, b)
return a > b -- besar ke kecil
end)
print(table.concat(skor, ", ")) -- 980, 450, 300, 120
Bagian B: dictionary
Membuat dan mengakses dictionary
Di dictionary, setiap nilai punya nama (kunci):
local pemain = {
nama = "Budi",
level = 12,
koin = 350,
isVIP = false,
}
Isinya diakses dengan titik, atau dengan kurung siku berisi teks. Kurung siku berguna kalau nama kuncinya disimpan di variabel.
print(pemain.nama) -- Budi
print(pemain["level"]) -- 12
local statYangDicek = "koin"
print(pemain[statYangDicek]) -- 350
Mengubah, menambah, dan menghapus
pemain.koin += 50 -- ubah
pemain.senjata = "Pedang" -- tambah kunci baru
pemain.isVIP = nil -- hapus: isi dengan nil
print(pemain.koin, pemain.senjata, pemain.isVIP)
Loop dengan pairs
Perhatian: urutan pairs tidak dijamin sama seperti saat ditulis.
for kunci, nilai in pairs(pemain) do
print(kunci, "=", nilai)
end
# tidak bisa menghitung isi dictionary (hasilnya 0). Hitung manual dengan loop:
print("#pemain =", #pemain)
local jumlahStat = 0
for _ in pairs(pemain) do
jumlahStat += 1
end
print("Jumlah stat:", jumlahStat)
Dictionary sebagai katalog
local hargaToko = {
Pedang = 250,
Perisai = 180,
Ramuan = 50,
}
local function cekHarga(namaItem)
local harga = hargaToko[namaItem]
if harga == nil then
return "Item tidak dijual"
end
return `{namaItem} harganya {harga} koin`
end
print(cekHarga("Ramuan"))
print(cekHarga("Naga"))
Bagian C: table di dalam table
Data pemain lengkap, persis seperti yang nanti disimpan di Roblox:
local dataPemain = {
nama = "Siti",
stats = {
level = 8,
xp = 340,
},
inventory = {"Tongkat Sihir", "Ramuan", "Ramuan"},
}
print(dataPemain.stats.level) -- 8
print(dataPemain.inventory[1]) -- Tongkat Sihir
print("Jumlah item:", #dataPemain.inventory)
Array berisi dictionary, misalnya papan peringkat:
local papanPeringkat = {
{nama = "Budi", skor = 450},
{nama = "Siti", skor = 980},
{nama = "Andi", skor = 300},
}
table.sort(papanPeringkat, function(a, b)
return a.skor > b.skor
end)
print("=== PAPAN PERINGKAT ===")
for posisi, data in ipairs(papanPeringkat) do
print(`#{posisi} {data.nama} - {data.skor}`)
end
Bagian D: jebakan referensi
Table disimpan sebagai referensi, bukan salinan. Dua variabel bisa menunjuk ke table yang sama:
local tasA = {"Apel"}
local tasB = tasA -- BUKAN salinan! tasB = tasA yang sama
table.insert(tasB, "Jeruk")
print(#tasA) -- 2 <- tasA ikut berubah!
Kalau butuh salinan sungguhan, pakai table.clone:
local tasC = table.clone(tasA)
table.insert(tasC, "Mangga")
print(#tasA, #tasC) -- 2 3 <- tasA tidak ikut berubah
Catatan khusus Roblox
Table ada di mana-mana di Roblox:
workspace.Folder:GetChildren()mengembalikan array berisi objek:for _, part in ipairs(workspace.Rintangan:GetChildren()) do part.Anchored = true endgame.Players:GetPlayers()mengembalikan array berisi pemain.- DataStore, yang menyimpan progres pemain, menyimpan table seperti
dataPemaindi atas. - Konfigurasi toko, daftar level, dan hadiah biasanya ditulis sebagai dictionary seperti
hargaToko.
Latihan
- Buat array
daftarBelanjaberisi 3 item. Tambahkan 1 item di akhir, hapus item pertama, lalu print semuanya denganipairsbeserta nomor urutnya. - Buat function
hitungItem(inventory, namaItem)yang me-return berapa kalinamaItemmuncul di arrayinventory. Uji dengan{"Ramuan", "Pedang", "Ramuan", "Ramuan"}; hasil untuk Ramuan harus 3. - Buat dictionary
hargaToko(minimal 3 item) dan functionbeli(koin, namaItem)yang:return false, "Item tidak ada"kalau item tidak dijual;return false, "Koin kurang X"kalau koin tidak cukup;return true, sisaKoinkalau berhasil.
- Buat array berisi minimal 4 pemain
{nama = ..., level = ...}. Urutkan dari level tertinggi, lalu print 3 teratas saja (petunjuk: pakaibreak).
Kunci jawaban
Coba kerjakan sendiri dulu sebelum membaca bagian ini.
Latihan 1: daftar belanja
local daftarBelanja = {"Roti", "Susu", "Telur"}
table.insert(daftarBelanja, "Keju") -- tambah di akhir
table.remove(daftarBelanja, 1) -- hapus yang pertama (Roti)
for i, barang in ipairs(daftarBelanja) do
print(`{i}. {barang}`)
end
-- 1. Susu
-- 2. Telur
-- 3. Keju
Latihan 2: hitung item di inventory
local function hitungItem(inventory, namaItem)
local jumlah = 0
for _, item in ipairs(inventory) do
if item == namaItem then
jumlah += 1
end
end
return jumlah
end
local tas = {"Ramuan", "Pedang", "Ramuan", "Ramuan"}
print("Ramuan:", hitungItem(tas, "Ramuan")) -- 3
print("Pedang:", hitungItem(tas, "Pedang")) -- 1
print("Kapak:", hitungItem(tas, "Kapak")) -- 0
Latihan 3: function beli dengan dictionary harga
local hargaToko = {
Pedang = 250,
Perisai = 180,
Ramuan = 50,
}
local function beli(koin, namaItem)
local harga = hargaToko[namaItem]
if harga == nil then
return false, "Item tidak ada"
end
if koin < harga then
return false, `Koin kurang {harga - koin}`
end
return true, koin - harga
end
print(beli(300, "Pedang")) -- true 50
print(beli(100, "Pedang")) -- false Koin kurang 150
print(beli(999, "Naga")) -- false Item tidak ada
Perhatikan urutan pengecekannya: cek item ada dulu, baru cek harganya. Kalau dibalik, koin < harga dengan harga = nil akan error.
Latihan 4: 3 pemain dengan level tertinggi
local daftarPemain = {
{nama = "Budi", level = 12},
{nama = "Siti", level = 30},
{nama = "Andi", level = 7},
{nama = "Rina", level = 21},
{nama = "Joko", level = 15},
}
table.sort(daftarPemain, function(a, b)
return a.level > b.level -- besar ke kecil
end)
print("=== TOP 3 ===")
for posisi, pemain in ipairs(daftarPemain) do
if posisi > 3 then
break
end
print(`#{posisi} {pemain.nama} (level {pemain.level})`)
end
-- #1 Siti (level 30)
-- #2 Rina (level 21)
-- #3 Joko (level 15)
Alternatif tanpa break: for posisi = 1, math.min(3, #daftarPemain) do. math.min menjaga supaya tidak error kalau jumlah pemainnya kurang dari 3.
Diskusi (0)
Kami menyimpan nama (opsional), komentar, dan hash teknis (bukan alamat IP asli) untuk mencegah spam. Cookie fungsional dipakai agar Anda dapat mengedit atau menghapus komentar sendiri dari browser ini. Untuk permintaan penghapusan, gunakan halaman kontak.
Belum ada komentar. Mulai diskusinya.