Ruby on rails 除掉;“副本”;嵌套散列
我有一个嵌套哈希:Ruby on rails 除掉;“副本”;嵌套散列,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个嵌套哈希: given = { "AA" => { :GE => nil, "GE" => "successful", :GR => nil, :ZG => nil, "ZG" => "successful", }, "BB" => { :MM => nil, "MM" => "successful", :GR => nil, :ZZ
given = {
"AA" => {
:GE => nil,
"GE" => "successful",
:GR => nil,
:ZG => nil,
"ZG" => "successful",
},
"BB" => {
:MM => nil,
"MM" => "successful",
:GR => nil,
:ZZ => nil,
"ZZ" => "successful",
}
}
我的目标是将其转换为一个新的哈希,而不包含重复项,例如:GE/“GE”和:ZG/“ZG”等等
goal = {
"AA" => {
:GE => "successful",
:GR => nil,
:ZG => "successful",
},
"BB" => {
:MM => "successful",
:GR => nil,
:ZZ => "successful",
}
}
我的尝试是使用Rails方法index_by
given.map do |key, value|
value.index_by {|r| value[r]}
end
或与
given.each { |key,value| temp_hash = {} (value.each { |va| va[0].each { |k,v| temp_hash|key| << val }}) given_hash[k.to_sym] = temp_hash if given.has_key?(k.to_sym)}
given.each{key,value{temp|u hash={}(value.each{va}va[0]。each{k,v{temp|u hash}我假设在{:GE=>nil,“GE”=>“successful”}
的情况下,您希望使用第一个truthy值(“successful”),并确保键是一个符号:
result = given.transform_values do |inner_hsh|
inner_hsh.group_by do |k,v|
k.to_sym
end.transform_values do |key_vals|
key_vals.to_h.values.find(&:itself)
end
end
假设@max的假设是正确的,并且内部散列中键的顺序并不重要,下面是生成所需返回值的另一种方法
given.each_with_object({}) do |(k,v),h|
h[k] = v.sort_by { |_,w| w.nil? ? 1 : 0 }.uniq { |m,_| m.to_s }.to_h
end
#=> {"AA"=>{"GE"=>"successful", "ZG"=>"successful", :GR=>nil},
# "BB"=>{"MM"=>"successful", "ZZ"=>"successful", :GR=>nil}}
看,特别是这句话,“按顺序遍历自我,保留第一次出现。”
为了
我们计算
a = v.sort_by { |_,w| w.nil? ? 1 : 0 }
#=> [["GE", "successful"], ["ZG", "successful"],
# [:GE, nil], [:GR, nil], [:ZG, nil]]
b = a.uniq { |m,_| m.to_s }
#=> [["GE", "successful"], ["ZG", "successful"], [:GR, nil]]
因为“GE”
在:GE
之前,而“ZG”
在:ZG
之前
h[k] = b.to_h
#=> {"GE"=>"successful", "ZG"=>"successful", :GR=>nil}
如果@max的假设是正确的,我建议您编辑您的答案,以明确这一点(例如,“以及我的目标……等等,删除值为nil
”的键)。哦,您是对的!我没有想到这一点。@max的答案有效,但我应该再等一会儿。下次!
h[k] = b.to_h
#=> {"GE"=>"successful", "ZG"=>"successful", :GR=>nil}