Другим вариантом является построение хеша, группы которого дублируются (true), а не (false).
С учетом массива:
ary = [
{name: "King Summer", number: "0034242342"},
{name: "Max Snow", number: "899899080"},
{name: "Duck Doe", number: "90897688"},
{name: "Shark Jon", number: "0034242342"},
{name: "Jim Kirk", number: "90897688"},
{name: "Mr. Spock", number: "10897688"}
]
Создание хеша:
res = ary.group_by { |h| h[:number] }.group_by { |_,v| v.size > 1 }.transform_values(&:to_h)
#=> {true=>{"0034242342"=>[{:name=>"King Summer", :number=>"0034242342"}, {:name=>"Shark Jon", :number=>"0034242342"}], "90897688"=>[{:name=>"Duck Doe", :number=>"90897688"}, {:name=>"Jim Kirk", :number=>"90897688"}]}, false=>{"899899080"=>[{:name=>"Max Snow", :number=>"899899080"}], "10897688"=>[{:name=>"Mr. Spock", :number=>"10897688"}]}}
Затем перечислите дубликаты:
res[true].each do |number, people|
puts "- ph. number: #{number}"
people.each { |person| puts "\t"*2 + person[:name] }
end
# - ph. number: 0034242342
# King Summer
# Shark Jon
# - ph. number: 90897688
# Duck Doe
# Jim Kirk
Или
res.each do |_, list|
puts "-"*10
list.each do |number, people|
puts "- ph. number: #{number}"
people.each { |person| puts "\t"*2 + person[:name] }
end
end
# ----------
# - ph. number: 0034242342
# King Summer
# Shark Jon
# - ph. number: 90897688
# Duck Doe
# Jim Kirk
# ----------
# - ph. number: 899899080
# Max Snow
# - ph. number: 10897688
# Mr. Spock