按日期时间从数组中排序数组的哈希映射

Org*_*cat 7 sorting ruby-on-rails

我的hashmap如下:

variable_name[user] = { url, datetime }
variable_name[user] << { url1, datetime1 }
variable_name[user] << { url2, datetime2 }
variable_name[user] << { url3, datetime3 }
Run Code Online (Sandbox Code Playgroud)

如果可能,我如何在RoR中按日期时间对此进行排序?

edit:variable_name是一个哈希,[user]是一个键.值是一个数组

Max*_*unn 10

假设variable_name是一个数组,你的意思是:

variable_name[user] = {:url => url, :datetime => datetime }
Run Code Online (Sandbox Code Playgroud)

一种简单的升序排序方法:

variable_name.sort_by {|vn| vn[:datetime]}
Run Code Online (Sandbox Code Playgroud)

要对降序进行排序,您可以使用完整排序:

variable_name.sort {|vn1, vn2| vn2[:datetime] <=> vn1[:datetime]}
Run Code Online (Sandbox Code Playgroud)

  • `variable_name.sort_by {| vn | vn [:datetime]}.reverse`也可以工作,并且会让我更加清楚地看到降序排序. (8认同)

Pet*_*tee 1

可以在 Ruby 中对任何内容进行排序,但请记住,您最终会得到一个已排序的数组。虽然从 Ruby 1.9 开始哈希值有内部顺序,但 Hash#sort 方法仍然返回一个数组。

例如:

hash = {
  user1: { name: 'Baz', date: Time.current },
  user2: { name: 'Bar', date: Time.current - 1.month },
  user3: { name: 'Foo', date: Time.current - 2.months },
}

hash.sort { |x, y| x.last[:date] <=> y.last[:date] }
Run Code Online (Sandbox Code Playgroud)

会给你结果:

[
  [:user3, {:name=>"Foo", :date=>Tue, 07 Aug 2012 20:32:23 CEST +02:00}],
  [:user2, {:name=>"Bar", :date=>Fri, 07 Sep 2012 20:32:23 CEST +02:00}],
  [:user1, {:name=>"Baz", :date=>Sun, 07 Oct 2012 20:32:23 CEST +02:00}]
]
Run Code Online (Sandbox Code Playgroud)

不过,将其映射回哈希值并不是非常困难。