Arrays 如何根据哈希中的所有键是否与另一个哈希匹配从数组中删除哈希

Arrays 如何根据哈希中的所有键是否与另一个哈希匹配从数组中删除哈希,arrays,ruby,hash,unique,Arrays,Ruby,Hash,Unique,我有一个散列数组,其中每个散列都是URI::decode_www_表单中的URL参数列表。我希望删除此数组中的重复项,以便数组中的所有哈希都具有唯一的参数键 例如,如果我有 arr = [{"update" => "1", "reload" => "true"}, {"update" => "5", "reload" => "false"}, {"update" => "9", "reload" => "false"},

我有一个散列数组,其中每个散列都是URI::decode_www_表单中的URL参数列表。我希望删除此数组中的重复项,以便数组中的所有哈希都具有唯一的参数键

例如,如果我有

arr = [{"update" => "1", "reload" => "true"},
       {"update" => "5", "reload" => "false"},
       {"update" => "9", "reload" => "false"},
       {"update" => "7", "reload" => "true", "newvalue" => "11111"},
       {"page" => "1"}]
我希望有一个数组只包含:

arr = [{"update" => "1", "reload" => "true"},
       {"update" => "7", "reload" => "true", "newvalue" => "11111"},
       {"page" => "1"}]
其中前三个条目彼此重复,因此只保留其中一个条目,第四个条目是唯一的,因为它有一个前三个条目没有的额外唯一密钥,第五个条目是唯一的,因为它与任何条目都不相同


我将如何尝试解决此问题?

您可以这样解决:

tmp = {}
b = arr.select do |h|
  if tmp[h.keys]
    false
  else
    tmp[h.keys] = true
    true
  end
end

你可以这样解决:

tmp = {}
b = arr.select do |h|
  if tmp[h.keys]
    false
  else
    tmp[h.keys] = true
    true
  end
end
请参阅文档,了解uniq采用块的情况。实际上,Ruby正在执行以下操作以确定要选择arr的哪些元素:

a = arr.map(&:keys) 
  #=> [["update", "reload"],
  #    ["update", "reload"],
  #    ["update", "reload"],
  #    ["update", "reload", "newvalue"],
  #    ["page"]] 

a.uniq
  #=> [["update", "reload"], ["update", "reload", "newvalue"], ["page"]]
arr.uniq&:键的效果与:

arr.uniq { |h| h.keys }
  #=> [{"update"=>"1", "reload"=>"true"},
  #    {"update"=>"7", "reload"=>"true", "newvalue"=>"11111"},
  #    {"page"=>"1"}] 
许多人认为arr.uniq&:keys只是用块编写上述表达式的一种简捷方法。没关系,但实际上arr.uniq&:keys将符号:keys表示的方法转换为proc,然后调用该proc

请参阅文档,了解uniq采用块的情况。实际上,Ruby正在执行以下操作以确定要选择arr的哪些元素:

a = arr.map(&:keys) 
  #=> [["update", "reload"],
  #    ["update", "reload"],
  #    ["update", "reload"],
  #    ["update", "reload", "newvalue"],
  #    ["page"]] 

a.uniq
  #=> [["update", "reload"], ["update", "reload", "newvalue"], ["page"]]
arr.uniq&:键的效果与:

arr.uniq { |h| h.keys }
  #=> [{"update"=>"1", "reload"=>"true"},
  #    {"update"=>"7", "reload"=>"true", "newvalue"=>"11111"},
  #    {"page"=>"1"}] 

许多人认为arr.uniq&:keys只是用块编写上述表达式的一种简捷方法。没关系,但实际上arr.uniq&:keys将符号:keys表示的方法转换为proc,然后调用该proc。

您是如何尝试解决此问题的?为什么你认为前三个是重复的?它们都是不同的。@vgoff它们的键是相同的,这就是我试图删除的重复项。您可以编辑问题以澄清这一点,而不是唯一键的条目。。我并没有像我应该的那样强烈地依靠标题来暗示你是如何试图解决这个问题的?为什么你认为前三个是重复的?它们都是不同的。@vgoff它们的键是相同的,这就是我试图删除的重复项。您可以编辑问题以澄清这一点,而不是唯一键的条目。。我并没有像我应该的那样强烈地依靠标题来暗示你能不能在你的答案中再加一点细节,解释一下为什么它对其他读者有效?tmp散列用于跟踪我们以前是否见过一组特定的密钥。我们迭代数组中的每个散列,并使用其键从tmp返回一个值。如果我们得到nil,我们以前没有见过它,所以我们将它设置为tmp[h.keys]=true并返回true。否则我们将返回false。Arrayselect将只返回所提供块中返回true的值,这是具有任何唯一密钥集的第一个散列。您能否在回答中添加一点细节,说明它为什么适用于其他读取器?tmp散列用于跟踪我们以前是否见过一组特定的密钥。我们迭代数组中的每个散列,并使用其键从tmp返回一个值。如果我们得到nil,我们以前没有见过它,所以我们将它设置为tmp[h.keys]=true并返回true。否则我们将返回false。Arrayselect将只返回所提供块中返回true的值,这是具有任何唯一键集的第一个散列。感谢您的回答,您能否解释&:在本例中做了什么?感谢您的回答,您能否解释&:在本例中做了什么?