订购哈希并删除第一个键值对

Fel*_*ger 5 ruby ruby-on-rails hashmap ruby-2.3

我有一个带时间戳的哈希作为键.

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

我订购了这个系列并获得了第一对,如下所示:

hash.sort_by {|k, _| k}.first.first
Run Code Online (Sandbox Code Playgroud)

但是我该如何删除它?

delete方法要求您知道密钥的exakt拼写.当然我可以返回密钥然后在delete方法中使用它,但我在想是否还有更直接的方法?

Leo*_*lán 8

您正在寻找的方法是hash.keys返回键的数组:

hash.delete(hash.keys.min)

编辑:我已经更新了答案,以反映必须首先对密钥进行排序,这已添加到原始问题中,并由@Shadwell在本文的评论中提出.

我按照@Cary Swoveland的建议替换hash.keys.sort.firsthash.keys.min它,它不仅性能更高,而且语义更好.


Kel*_*nan 7

另请注意,shift可以在哈希值上使用.

hash.shift

从哈希中删除第一个键值对.也适用于数组.

  • 你需要在`hash.shift'之后添加`hash`行,或者用`hash.tap {| h |替换你的行.hash.shift}`. (2认同)