按嵌套值排序哈希值

时间:2015-08-31 05:50:30

标签: ruby hash

我的哈希看起来如下。我希望输出采用相同的哈希形式,但根据价格排列哈希。

{
  1=>{
    "name"=>"Mark", 
    "date"=>"27/08/2015", 
    "bed"=>"3", 
    "furnish"=>"Fully", 
    "size"=>"10", 
    "price"=>790000
  }, 
  2=>{
    "name"=>"Mark", 
    "date"=>"27/08/2015", 
    "bed"=>"3", 
    "furnish"=>"Fully", 
    "size"=>"10", 
    "price"=>720000
  }, 
  3=>{
    "name"=>"Mark", 
    "date"=>"27/08/2015", 
    "bed"=>"3", 
    "furnish"=>"Fully", 
    "size"=>"10", 
    "price"=>750000
  }, 
  4=>{
    "name"=>"Mark", 
    "date"=>"27/08/2015", 
    "bed"=>"3", 
    "furnish"=>"Fully", 
    "size"=>"10", 
    "price"=>710000
  }
} 

我已从How to sort a Ruby Hash by number value?读取,但它只是一个嵌套哈希。对我如何实现这一目标完全无能为力。如果你们中的任何一个愿意帮助我,我们将不胜感激。

2 个答案:

答案 0 :(得分:5)

试试这个:

> myhash.sort_by{|_,v| v["price"]}.to_h
#=> 
    {
      4=>
        {
          "name"=>"Mark", 
          "date"=>"27/08/2015", 
          "bed"=>"3", 
          "furnish"=>"Fully", 
          "size"=>"10", 
          "price"=>710000
        }, 
      2=>
        {
          "name"=>"Mark", 
          "date"=>"27/08/2015", 
          "bed"=>"3", 
          "furnish"=>"Fully", 
          "size"=>"10", 
          "price"=>720000
        }, 
      3=>
        {
          "name"=>"Mark", 
          "date"=>"27/08/2015", 
          "bed"=>"3", 
          "furnish"=>"Fully", 
          "size"=>"10", 
          "price"=>750000
        }, 
      1=>
        {
          "name"=>"Mark", 
          "date"=>"27/08/2015", 
          "bed"=>"3", 
          "furnish"=>"Fully", 
          "size"=>"10", 
          "price"=>790000
        }
    } 

更新

如果您的字符串价格为"15,000",那么您可以删除逗号分隔符并将其转换为整数,如:

> "15,000"
> "15,000".tr(',', '').to_i
#=> 15000

所以代码就像:

> myhash.sort_by{|_,v| v["price"].tr(',', '').to_i}.to_h

答案 1 :(得分:1)

如果您的数据(哈希)已分配给变量h,那么您可以使用以下代码按price对其进行排序:

h.sort_by {|key, value| value['price'].to_f}

它为您提供了一组[key,value]对。要将其转换回哈希值,您可以使用:

Hash[h.sort_by {|key, value| value['price'].to_f}]

Ruby(2.1+)的最新版本中,您也可以使用to_h方法。

<强>更新

由于您已将价格更改为数值,因此不再需要to_f转换。所以最终的代码如下:

h.sort_by {|key, value| value['price']}.to_h