2016-07-09 75 views
0

我有一个散列数组,其中每个散列是来自URI :: decode_www_form的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"}] 

其中前三个条目是彼此的副本,以便只保留其中的一个,第四个是独一无二的,因为它有一个前三个没有的额外的唯一键,第五个是唯一的,因为它与其中的任何一个不一样。

我会如何解决这个问题?

+0

你是如何尝试解决这个问题的?你为什么认为前三个是重复的?他们都有不同。 – vgoff

+0

@vgoff他们的钥匙是一样的,这是我想要删除重复项。 –

+0

您可以编辑问题以澄清唯一键的条目,而不是条目。我没有依赖提供该提示的标题,因为我应该具有的强度。 :( – vgoff

回答

1

你可以解决这个问题是这样的:

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

你可以在你的答案中加入一些更详细的信息,说明它为什么适用于其他读者? –

+0

'tmp'哈希用于跟踪我们以前是否看过一组特定的密钥。该数组并使用它的键从'tmp'返回一个值,如果我们得到'nil'我们之前没有看到它,所以我们将它设置为'tmp [h.keys] = true'并返回'true'。否则,我们只返回'false';'Array#select'将只返回在所提供的块中返回'true'的值 - 带有任何唯一键的第一个散列 –

1
arr = [{"update" => "1", "reload" => "true"}, 
     {"update" => "5", "reload" => "false"}, 
     {"update" => "9", "reload" => "false"}, 
     {"update" => "7", "reload" => "true", "newvalue" => "11111"}, 
     {"page" => "1"}] 

arr.uniq(&:keys) 
    #=> [{"update"=>"1", "reload"=>"true"}, 
    # {"update"=>"7", "reload"=>"true", "newvalue"=>"11111"}, 
    # {"page"=>"1"}] 

对于其中uniq需要一个块的情况下看到该文档为Array#uniq。实际上,红宝石执行以下操作来确定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(&:keys)具有相同的效果:

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。

+0

感谢您的答案, :在这种情况下呢? –

相关问题