Menu
CoddyTech

Menggabungkan dan Mengubah

Termasuk bagian Logika dan Alur dalam perjalanan Ruby di Coddy. Pelajaran 36 dari 56.

Saat bekerja dengan hash, ada dua operasi yang sangat sering digunakan sehingga Ruby menyediakan method khusus untuk keduanya.

merge menggabungkan dua hash menjadi hash baru. Jika keduanya memiliki key yang sama, nilai di sebelah kanan akan digunakan:

defaults = { color: "red", size: "M" }
custom   = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect   # {color: "red", size: "L"}

Keduanya tidak diubah, merge mengembalikan hash baru.

transform_values membuat hash baru dengan kunci yang sama, tetapi setiap nilainya diproses melalui sebuah blok:

prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect   # {apple: 1.2, bread: 3.6}

Dan transform_keys melakukan hal yang sama untuk kunci, berguna saat mengonversi string menjadi simbol atau menormalkan huruf besar-kecil:

{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}
challenge icon

Tantangan

Sedang

Diberikan dua hash keranjang: monday dan tuesday, masing-masing memetakan nama item berupa string ke jumlah berupa bilangan bulat. Toko ingin mendapatkan total dua hari yang dinormalisasi.

Buat satu hash akhir dengan cara:

  1. menggabungkan kedua hash menggunakan merge dengan blok, sehingga key yang ada di keduanya memiliki jumlah yang ditambahkan (bukan ditimpa)
  2. menerapkan transform_keys(&:to_sym) pada hasilnya, sehingga key menjadi symbol
  3. menggunakan transform_values untuk menerapkan diskon grosir 10%: setiap jumlah menjadi (qty * 9 / 10) dengan aritmetika bilangan bulat

Cetak hash akhir dengan inspect.

Untuk data default, output-nya adalah:

{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}

(Apel: 5 + 5 = 10, lalu 9. Roti: 3 + 2 = 5, lalu 4. Susu: hanya 6 pada hari Senin → 5. Keju: hanya 2 pada hari Selasa → 1.)

Coba sendiri

monday  = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }

# TODO: gunakan merge-with-block untuk menjumlahkan kunci yang sama, lalu ubah kunci menjadi simbol,
#       lalu terapkan * 9 / 10 pada setiap nilai, lalu periksa hasilnya
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Ruby online