Với phương thức uniq bạn có thể loại bỏ TẤT CẢ phần tử trùng lặp khỏi mảng. Hãy xem cách hoạt động!
Nếu bạn có mảng như sau:
n = [1,1,1,2,3,4,5]
Số 1 bị trùng. Gọi uniq trên mảng này loại bỏ các bản sao & trả về mảng MỚI với số duy nhất.
Ví dụ:
n.uniq # [1,2,3,4,5]
Lưu ý uniq KHÔNG thay đổi n (mảng gốc), nên cần gọi uniq! hoặc lưu mảng mới.
Ví dụ:
unique_numbers = n.uniq
Rất dễ, đúng không? Nhưng nhiều người không biết uniq nhận block. Với block, bạn làm được điều nâng cao hơn. Để tôi giải thích...
Cách Dùng Ruby Uniq Method Với Block
Khi gọi uniq, nó hoạt động bằng cách tạo hash từ phần tử mảng. Mỗi phần tử thành key trong hash. Vì key hash duy nhất, ta lấy danh sách tất cả key trong hash, danh sách này thành mảng mới với phần tử duy nhất.
Bây giờ: Nếu muốn thay đổi điều kiện làm cho cái gì đó duy nhất, bạn truyền block. Ví dụ:
fruits = %w(orange apple banana)
"Orange" và "Banana" cùng độ dài 6 ký tự. Nếu dùng uniq như sau:
fruits.uniq(&:size) # ["orange", "apple"]
Thì "banana" bị loại vì trùng khi so sánh chuỗi theo size.
Ví dụ khác:
objects = [1, 2, "a", "b", :c, :d] objects.uniq(&:class)
Đây lấy mảng đối tượng duy nhất theo class:
[1, "a", :c]
Bạn thấy sức mạnh? Khi truyền block cho uniq, bạn định nghĩa chính xác quy tắc cái gì coi là duy nhất.
Cách Dùng Uniq Với Nhiều Điều Kiện
Bạn có thể dùng nhiều điều kiện! Cách làm: Giả sử class User có: age, name, country. Muốn chỉ một người mỗi quốc gia cùng tuổi. Dễ dàng với block:
[david, petter, raphael].uniq { |person| [person.age, person.country] }
Với code này, cả hai điều kiện phải khớp trước khi coi là duy nhất.
Cơ Chế Hoạt Động
Không có block, object thành hash key. Có block, giá trị yielded thành hash key, object thành hash value. Sau đó... Ruby lấy values & trả về mảng mới. Chi tiết triển khai, nhưng tôi thấy thú vị nên chia sẻ.
Tóm Tắt
Bạn đã học phương thức uniq trong Ruby! Cách dùng, tại sao hữu ích, và cơ chế hoạt động. Bây giờ thực hành phương thức này để nhớ. Cảm ơn bạn đã đọc!