2016-07-09 73 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

感謝您的答案, :在這種情況下呢? –

相關問題