【发布时间】:2013-05-03 08:42:41
【问题描述】:
我有一个 Array 和 Hashes 具有相同的密钥,用于存储人们的数据。
我想删除键 :name 和 :surname 具有相同值的哈希值。其余值可能不同,因此在数组上调用 uniq! 将不起作用。
有没有简单的解决方案?
【问题讨论】:
我有一个 Array 和 Hashes 具有相同的密钥,用于存储人们的数据。
我想删除键 :name 和 :surname 具有相同值的哈希值。其余值可能不同,因此在数组上调用 uniq! 将不起作用。
有没有简单的解决方案?
【问题讨论】:
您可以将一个块传递给uniq或uniq!,块返回的值用于比较两个条目是否相等:
irb> people = [{name: 'foo', surname: 'bar', age: 10},
{name: 'foo', surname: 'bar' age: 11}]
irb> people.uniq { |p| [p[:name], p[:surname]] }
=> [{:name=>"foo", :surname=>"bar", :age=>10}]
【讨论】:
arr=[{name: 'john', surname: 'smith', phone:123456789},
{name: 'thomas', surname: 'hardy', phone: 671234992},
{name: 'john', surname: 'smith', phone: 666777888}]
# [{:name=>"john", :surname=>"smith", :phone=>123456789},
# {:name=>"thomas", :surname=>"hardy", :phone=>671234992},
# {:name=>"john", :surname=>"smith", :phone=>666777888}]
arr.uniq {|h| [h[:name], h[:surname]]}
# [{:name=>"john", :surname=>"smith", :phone=>123456789},
# {:name=>"thomas", :surname=>"hardy", :phone=>671234992}]
【讨论】:
+,而不是块内的&&。实际上,您可能想构造一个数组进行比较。
unique_people = {}
person_array.each do |person|
unique_people["#{person[:name]} #{person[:surname]}"] = person
end
array_of_unique_people = unique_people.values
这应该可以解决问题。
【讨论】:
a.delete_if do |h|
a.select{|i| i[:name] == h[:name] and i[:surname] == h[:surname] }.count > 1
end
【讨论】: