Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 除掉;“副本”;嵌套散列_Ruby On Rails_Ruby - Fatal编程技术网

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}