我有以下哈希数组,并希望删除具有重复:名称值的哈希值。
如果任何哈希值为:enabled设置为true:name,则:enabled为true。否则它应该是假的。
所以,鉴于此:
[{:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>false}, {:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>true}]
我想最终:
[{:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>true}]
因为:至少在以下两者的哈希值中都设置为true:name =>“one”和:name =>“two”
我该怎么做?
答案 0 :(得分:1)
each_with_object
和map
的组合可以帮助您:
a.each_with_object({ }) { |e,h| h[e[:name]] ||= e[:enabled] }\
.map { |k,v| { :name => k, :enabled => v } }
例如:
>> a = [{:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>false}, {:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>true}, {:name=>"three", :enabled=>false}]
=> [{:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>false}, {:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>true}, {:name=>"three", :enabled=>false}]
>> compressed = a.each_with_object({ }) { |e,h| h[e[:name]] ||= e[:enabled] }.map { |k,v| { :name => k, :enabled => v } }
=> [{:name=>"one", :enabled=>true}, {:name=>"two", :enabled=>true}, {:name=>"three", :enabled=>false}]
each_with_object
总结了小哈希中的:name
/ :enabled
对,同时将布尔值折叠为true
(如果其中任何一个为真)(对于给定的{{1}然后:name
将摘要哈希解包为原始表单的哈希值。
答案 1 :(得分:1)
为简化起见,我假设:enabled和:name是每个哈希中唯一的两个元素。
original = [{:enabled=>true, :name=>"one"}, {:enabled=>false, :name=>"two"}, {:enabled=>true, :name=>"one"}, {:enabled=>true, :name=>"two"}]
构建临时哈希以存储它,并折叠值。
new_hash = Hash.new(false)
list.each do |element|
new_hash[element[:name]] ||= element[:enabled]
end
最后,迭代哈希以恢复原始格式。
new_array = []
new_hash.each_pair do |k, v|
new_array << {:name => k, :enabled => v}
end
答案 2 :(得分:1)
我已经完成了:
inject({}){|memo, h| memo.merge({ h[:name] => (memo[:name] || h[:enabled])} )}.map{|k,v| {:name => k, :enabled => v } }