删除重复的哈希值并根据值设置值

时间:2011-08-11 23:15:31

标签: ruby-on-rails ruby

我有以下哈希数组,并希望删除具有重复:名称值的哈希值。

如果任何哈希值为: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”

我该怎么做?

3 个答案:

答案 0 :(得分:1)

each_with_objectmap的组合可以帮助您:

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 } }