【问题标题】:sorting while or after merging hashes, in ruby在合并哈希时或之后排序,在红宝石中
【发布时间】:2012-07-05 11:58:48
【问题描述】:

我有一个看起来像这样的哈希

myhash =   [{"project 1"=>{"09 Apr 12, Mon"=>"2.75"}}, {"project 1"=>{"11 Apr 12,
Wed"=>"3.200000047683716"}}, {"project 1"=>{"25 Apr 12, Wed"=>"0.5099999904632568"}},   
{"project 1"=>{"31 May 12, Thu"=>"1"}}, {"project 1"=>{"01 Jun 12, Fri"=>"1"}}, {"project  
2"=>  {"01 Jun 12, Fri"=>"0"}}, {"project 1"=>{"04 Jun 12, Mon"=>"0.25"}}]

我想根据它们的键合并内部散列。这样键不会重复

我试过了,

myhash.inject{|memo, el| memo.merge( el ){|k, old_v, new_v| old_v.merge(new_v)}}

给出正确的结果

=>{"project 2"=>{"01 Jun 12, Fri"=>"0"}, "project 1"=>{"01 Jun 12, Fri"=>"1", "09 Apr 
12, Mon"=>"2.75", "11 Apr 12, Wed"=>"3.200000047683716", "31 May 12, Thu"=>"1", "25 Apr  
12, Wed"=>"0.5099999904632568", "04 Jun 12, Mon"=>"0.25"}}

但是订单丢失了。如何根据作为哈希内键的日期对哈希进行排序。

或在合并自身时保持顺序。

我正在使用 ruby​​ 1.8.7

【问题讨论】:

  • 将它们转换成某种 Date 对象怎么样?
  • 看起来这是我唯一可用的选项。不过不确定。可能有更好的方法
  • 这里有一个哈希值。是内部哈希需要按日期顺序排序吗?

标签: ruby-on-rails ruby


【解决方案1】:

应该这样做。请注意,我已经解析了日期以便对它们进行排序。将它们恢复为原始格式应该是微不足道的。 merged 是您提供的合并无序哈希。

merged.map{|k,v| { k => v.sort_by{|d,f| Date.strptime(d.split(',')[0],"%d %b %y").to_s   } } }

您可能想考虑使用 Date 对象和数组而不是散列,后者(至少在 1.8.7 中)是无序的。

【讨论】:

  • 谢谢。我更喜欢散列,因为我需要将此数据以 json 格式发送到客户端,我可以将其转换回散列,以便快速访问
  • 可以从排序的输出中删除日期吗?
  • 您可以使用过滤方法将它们删除:ruby-doc.org/core-1.8.7/Array.html#method-i-select
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2015-05-29
相关资源
最近更新 更多