5

我有一个以时间戳为键的哈希。

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方法要求您知道密钥的准确拼写。当然我可以返回密钥然后在delete方法中使用它,但我在想是否有更直接的方法?

4

3 回答 3

9

另请注意,shift可以对 Hash 值使用。

hash.shift

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

于 2016-05-31T20:58:24.540 回答
8

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

hash.delete(hash.keys.min)

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

我按照@Cary Swoveland 的建议替换hash.keys.sort.first了 for hash.keys.min,它不仅性能更高,而且在语义上也更好。

于 2016-05-31T20:52:11.247 回答
2

由于 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
于 2016-05-31T21:19:21.537 回答