【发布时间】:2015-05-12 05:35:19
【问题描述】:
我有一个包含哈希的数组。我想按created_at 值对其进行排序。下面是数组结构的一个例子:
注意,我已经写了人类可读的日期,值将是时间戳。
[
{"group1"=>[
{:item1=>[{"name" => "Tim", "created_at"=>"4 weeks ago"}]},
{:item2=>[{"name" => "Jim", "created_at"=>"3 weeks ago"}]},
{:item3=>[{"name" => "Ted", "created_at"=>"2 weeks ago"}]},
]
},
{"group2"=>[
{:item1=>[{"name" => "Sally", "created_at"=>"1 month ago"}]},
{:item2=>[{"name" => "Willa", "created_at"=>"2 months ago"}]},
{:item3=>[{"name" => "Sammi", "created_at"=>"4 months ago"}]},
]
},
{"group3"=>[
{:item1=>[{"name" => "Jeff", "created_at"=>"1 month ago"}]},
{:item2=>[{"name" => "Lois", "created_at"=>"1 day ago"}]},
{:item3=>[{"name" => "Lisa", "created_at"=>"1 week ago"}]},
]
}
]
我想整理以上数据,以便输出首先是 group3,因为它包含一个 item 和 1 天前的 created_at 值。接下来是group1,因为它包含一个值为 2 周前的项目,group2 将是最后一个,因为它最近的日期是一个月前。
如何重新排列这些数据?
我在想我可能不得不做一些类似的事情
array_of_nested_hashes.each do |a|
a.sort_by { |k, v| v[:created_at] }
end
按日期对每个组中的数据进行排序,然后按第一个哈希的日期对每个组进行排序 - 因为这将是每个组中最近的哈希,给我完全排序的哈希,如下所示:
[
{"group3"=>[
{:item2=>[{"name" => "Lois", "created_at"=>"1 day ago"}]},
{:item3=>[{"name" => "Lisa", "created_at"=>"1 week ago"}]},
{:item1=>[{"name" => "Jeff", "created_at"=>"1 month ago"}]},
]
},
{"group1"=>[
{:item3=>[{"name" => "Ted", "created_at"=>"2 weeks ago"}]},
{:item2=>[{"name" => "Jim", "created_at"=>"3 weeks ago"}]},
{:item1=>[{"name" => "Tim", "created_at"=>"4 weeks ago"}]},
]
},
{"group2"=>[
{:item1=>[{"name" => "Sally", "created_at"=>"1 month ago"}]},
{:item2=>[{"name" => "Willa", "created_at"=>"2 months ago"}]},
{:item3=>[{"name" => "Sammi", "created_at"=>"4 months ago"}]},
]
},
]
【问题讨论】:
-
你能告诉我们想要的输出是什么样的吗?时间戳也很好,否则排序将查看整数,然后查看下一个字母。即 1 小时前 > 1 天前,尽管您的示例似乎没问题。
-
在这种情况下,所需的输出是重新排序的哈希。碰巧你之前回答了我的一个问题-顺便说一句,我正在使用的哈希值与以前相同。
-
谢谢,在 group_3 的输出中,为什么 1 个月高于 1 天?
-
好点,我只是专注于根据内容将“组”按正确的顺序排列,而不是完全整理出来,我在问题中添加了更多内容以显示我的想法那。很抱歉说这是我想要的输出,因为我不需要保留嵌套哈希的顺序。
-
我误解了你的问题吗?我的理解是,您想按每个
"group"的最新"created_at"值进行排序,并将所有值转换为天数(例如,出于以下目的,"2 weeks"将转换为14天数种类)。根据这个假设,如果"group3"的三个"created_at"值是"2 weeks", "6 days", "3 months",它仍然会排在第一位,因为"6 days"将胜过"2 weeks ago"和"1 month ago"。这是我做出的假设,但我看到其他人给出的答案做出了不同的假设。
标签: ruby-on-rails arrays ruby hash