Learn
← Previous Next →

Hari 29: Mini Proyek — Data Pipeline

90 min Last updated 09 Apr 2026

Data Pipeline dengan JavaScript Functional

// Utilitas pipeline
const pipe = (...fns) => data => fns.reduce((v, f) => f(v), data);
const map = fn => arr => arr.map(fn);
const filter = pred => arr => arr.filter(pred);
const reduce = (fn, init) => arr => arr.reduce(fn, init);
const sortBy = (key, desc = false) => arr =>
    [...arr].sort((a, b) => desc ? b[key] - a[key] : a[key] - b[key]);
const take = n => arr => arr.slice(0, n);

// Dataset transaksi
const transaksi = [
    { tanggal: "2024-01", kategori: "Makanan",     jumlah: 350000 },
    { tanggal: "2024-01", kategori: "Transport",   jumlah: 180000 },
    { tanggal: "2024-02", kategori: "Makanan",     jumlah: 420000 },
    { tanggal: "2024-02", kategori: "Elektronik",  jumlah: 1500000 },
    { tanggal: "2024-02", kategori: "Transport",   jumlah: 160000 },
    { tanggal: "2024-03", kategori: "Makanan",     jumlah: 380000 },
    { tanggal: "2024-03", kategori: "Hiburan",     jumlah: 200000 },
];

// Pipeline: filter Jan-Feb, group by kategori, hitung total, sort desc, top 3
const analisis = pipe(
    filter(t => t.tanggal <= "2024-02"),
    reduce((acc, t) => {
        acc[t.kategori] = (acc[t.kategori] || 0) + t.jumlah;
        return acc;
    }, {}),
)(transaksi);

Object.entries(analisis)
    .sort(([,a], [,b]) => b - a)
    .forEach(([kat, total]) =>
        console.log(`${kat}: Rp ${total.toLocaleString()}`)
    );

💡 Notice: reduce() sangat powerful untuk grouping. Object.entries() mengubah object menjadi [key,value] pairs untuk di-sort dan di-iterate.

Assignment

Implementasi pipeline analisis data: dari array transaksi, hitung total per kategori untuk SEMUA bulan, urutkan descending, tampilkan top 3.

Expected output:

Elektronik: Rp 1,500,000
Makanan: Rp 1,150,000
Transport: Rp 180,000
JS script.js
Solution
Output