簡體   English   中英

訂購哈希並刪除第一個鍵值對

[英]Order Hash and delete first key-value pair

我有一個帶時間戳的哈希作為鍵。

hash = {
  "2016-05-31T22:30:58+02:00" => {
          "path" => "/",
        "method" => "GET"
  },
  "2016-05-31T22:31:23+02:00" => {
          "path" => "/tour",
        "method" => "GET"
  },
  "2016-05-31T22:31:05+02:00" => {
          "path" => "/contact_us",
        "method" => "GET"
  }
}

我訂購了這個系列並獲得了第一對,如下所示:

hash.sort_by {|k, _| k}.first.first

但是我該如何刪除它?

delete方法要求您知道密鑰的exakt拼寫。 當然我可以返回密鑰然后在delete方法中使用它,但我在想是否還有更直接的方法?

您正在尋找的方法是hash.keys它返回鍵的數組:

hash.delete(hash.keys.min)

編輯 :我已經更新了答案,以反映必須首先對密鑰進行排序,這已添加到原始問題中,並由@Shadwell在本文的評論中提出。

hash.keys.sort.first hash.keys.min建議替換hash.keys.sort.firsthash.keys.min ,它不僅性能更高,而且語義更好。

另請注意,可以對哈希值使用shift

hash.shift

從哈希中刪除第一個鍵值對。 也適用於數組。

由於OP沒有聲明哈希的鍵是按排序順序排列的,我們必須假設它們不能保證。

hash = { "2016-05-31T22:31:05+02:00"=>{ "path"=>"/tour", "method"=>"GET" },
         "2016-05-31T22:30:58+02:00"=>{ "path"=>"/", "method"=>"GET" },
         "2016-05-31T22:31:23+02:00"=>{ "path"=>"/contact_us", "method"=>"GET" } }

首先,找到最小的鍵(第二個):

smallest_key = hash.keys.min
  #=> "2016-05-31T22:30:58+02:00" 

這顯然比排序密鑰然后采取最小的更有效。

因為日期時間字符串是iso8601格式,所以它們可以按字符串排序,而不必先將它們轉換為time對象。

然后使用Hash#reject獲取所需的哈希值:

hash.reject { |k,_| k == smallest_key }
  #=> {"2016-05-31T22:31:05+02:00"=>{"path"=>"/tour", "method"=>"GET"},
  #    "2016-05-31T22:31:23+02:00"=>{"path"=>"/contact_us", "method"=>"GET"}} 

要在適當的位置更改hash ,請寫入

hash.delete(smallest_key }
hash

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM