Gộp và chuyển đổi
Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 36 trên 56.
Có hai thao tác xuất hiện thường xuyên đến mức Ruby cung cấp phương thức riêng cho chúng khi làm việc với hash.
merge kết hợp hai hash thành một hash mới. Nếu cả hai có cùng khóa, giá trị bên phải sẽ được giữ lại:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Cả hai bản gốc đều không bị sửa đổi, merge trả về một hash mới.
transform_values tạo một hash mới với các khóa giống nhau, nhưng mỗi giá trị được truyền qua một khối lệnh:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}Và transform_keys làm điều tương tự với các khóa, hữu ích khi chuyển chuỗi thành symbol hoặc chuẩn hóa chữ hoa chữ thường:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Thử thách
Trung bìnhCó hai hash giỏ hàng: monday và tuesday, mỗi hash ánh xạ tên mặt hàng dạng chuỗi sang số lượng dạng số nguyên. Cửa hàng muốn có tổng đã chuẩn hóa cho hai ngày.
Tạo một hash cuối cùng bằng cách:
- dùng
mergeđể gộp hai hash với một khối lệnh, sao cho các khóa có trong cả hai hash sẽ có số lượng được cộng lại, không bị ghi đè - dùng
transform_keys(&:to_sym)cho kết quả, để các khóa trở thành symbol - dùng
transform_valuesđể áp dụng mức giảm giá 10% khi mua số lượng lớn: mỗi số lượng trở thành(qty * 9 / 10)bằng phép toán số nguyên
In hash cuối cùng bằng inspect.
Với dữ liệu mặc định, đầu ra là:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Táo: 5 + 5 = 10, sau đó là 9. Bánh mì: 3 + 2 = 5, sau đó là 4. Sữa: chỉ có 6 vào thứ Hai → 5. Phô mai: chỉ có 2 vào thứ Ba → 1.)
Tự làm thử
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: dùng merge với khối lệnh để cộng các khóa trùng nhau, rồi chuyển các khóa thành symbol,
# sau đó áp dụng * 9 / 10 cho mọi giá trị, rồi dùng inspect
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng xử lý
1Tìm hiểu sâu về chuỗi
Tổng quan về phương thức chuỗiNội suy chuỗiDuyệt qua chuỗiTách và nối chuỗiÔn tập: Đan chuỗi4Khối lệnh, Proc và lambda
Khối lệnh là gì?do..end và dấu ngoặc nhọnTừ khóa yieldTham số của khối lệnhProc và lambdaÔn tập: bộ lặp tùy chỉnh7Hash, phần 2
Hash.new với giá trị mặc địnhLặp qua HashHash lồng nhauGộp và chuyển đổiÔn tập: Bộ đếm tần suất10Dự án: Hồ sơ học sinh
Tổng quan dự ánThêm học sinh2Phạm vi
Phạm vi là gì?Các phương thức của phạm viPhạm vi trong case / whenÔn tập: luyện tập với phạm vi5Sức mạnh của Enumerable
select và rejectNối chuỗi mapreduce / injectcount, all?, any?, none?group_by và partitionsort_by, min_by, max_byÔn tập: quy trình dữ liệuTự luyện tập: Trình biên dịch Ruby online