Hầu như tất cả mọi người đã biết method uniq được sử dụng với mục đích để xoá những phần tử trùng nhau trong 1 array.
n = [1,1,1,2,3,4,5]
n.uniq
# [1,2,3,4,5]
Tuy nhiên, đối với những mảng phức tạp hơn, hoặc uniq theo điều kiện cụ thể thì mọi người sẽ đa số sẽ sử dụng loop in loop hoặc thử bất cứ thứ gì mọi người tìm được trên Stack Overflow thay vì vào document để tìm giải pháp. Mình cũng như thế và hầu như là đều như thế =))
Vào một ngày đẹp trời và KH thay đổi spec muốn mình uniq những users có cùng score và local. Sau tỉ tỉ vòng lặp và vô số lần nghi ngờ thì mình lại vào document và tìm được giải pháp có thể giải quyết vấn đề của mình. =))
Chắc mình cũng sẽ dần dần thay đổi mindset ở trên vì mình cảm thấy như thế sẽ tốt hơn với mình =))
Lan man quá lâu rồi chúng ta quay lại phần chính nha.
Nhiều người chưa biết rằng uniq có thể được sử dụng như 1 block, do đó bạn có sử dụng uniq nâng cao hơn.
Uniq With Multiple Conditions
- Có thể sử dụng nhiều điều kiện đối với 1 mảng hash!
users = [{name: 'a1', score: 1, local: 'danang'},
{name: 'a2', score: 1, local: 'danang'},
{name: 'a3', score: 1, local: 'danang'},
{name: 'a4', score: 2, local: 'hanoi'},
{name: 'a5', score: 2, local: 'hanoi'},
{name: 'a6', score: 3, local: 'hanoi'}
]
users.uniq { |user| [user[:score], user[:local]] }
#OUTPUT:
[{:name=>"a1", :score=>1, :local=>"danang"},
{:name=>"a4", :score=>2, :local=>"hanoi"},
{:name=>"a6", :score=>3, :local=>"hanoi"}]
Uniq Method With A Block
- Bạn có thể đặt mọi thứ mà bạn nghĩ nó có thể dùng làm rules khi uniq.
fruits = %w(orange apple banana)
# 'Orange' and 'Apple' **length of 6 characters**
fruits.uniq(&:size)
# ["orange", "apple"]
objects = [1, 2, "a", "b", :c, :d]
# 1, 2 -> Integer; 'a', 'b'-> String; :c, :d -> Symbol
objects.uniq(&:class)
#[1, "a", :c]
Qua bài viết, mình hi vọng có thể giúp bạn giải quyết được những vấn đề của bản thân trong tương lai.
Cảm ơn vì đã đọc!
Sources: https://www.rubyguides.com/2019/08/ruby-uniq-method/