在Ruby中,如何对哈希数组进行排序

h79rfbju  于 2023-02-03  发布在  Ruby
关注(0)|答案(3)|浏览(127)

我是Ruby的新手,有人能帮我吗?
我有一些产品数据Json,我需要按有效期排序,但是到目前为止,我用.sort_by尝试过的所有东西都有错误。
Json采用以下格式

{"wh_Repeating":[
    {
      "wh": {
        "Item_Number": "111166",
        "Expiry_Date": "2023-05-05"
      }
    },
    {
      "wh": {
        "Item_Number": "111167",
        "Expiry_Date": "2023-05-01"
      }
    },
    {
      "wh": {
        "Item_Number": "111168",
        "Expiry_Date": "2023-05-09"
      }
      }]}

在Ruby中显示为

{:wh_Repeating=>[
{:wh=>{:Item_Number=>"111166", :Expiry_Date=>"2023-05-05"}}, 
{:wh=>{:Item_Number=>"111167", :Expiry_Date=>"2023-05-01"}}, 
{:wh=>{:Item_Number=>"111168", :Expiry_Date=>"2023-05-09"}}
]}

尝试alsort最近的尝试是

sorted = jsonIn["wh_Repeating"]
sorted.sort_by { |k,v| v[:"Expiry_Date"] }
puts sorted

这给了我未定义的nil方法'sort_by':NilClass(NoMethodError)(异常)

fykwrbwg

fykwrbwg1#

哈希键是符号而不是字符串。
jsonIn["wh_Repeating"]应为jsonIn[:wh_Repeating]
同样,sorted.sort_by { |k,v| v[:"Expiry_Date"] }不会突变sorted
sort_by不会改变接收器。换句话说,sorted的值保持不变。有一个bang版本(sort_by!)会改变(一个副作用),但不鼓励使用改变函数。
这是你想做的。

jsonIn[:wh_Repeating].sort_by { |h| h.dig(:wh, :Expiry_Date) }
sshcrbum

sshcrbum2#

我会这样做:

data = {:wh_Repeating=>
         [{:wh=>{:Item_Number=>"111166", :Expiry_Date=>"2023-05-05"}},
          {:wh=>{:Item_Number=>"111167", :Expiry_Date=>"2023-05-01"}},
          {:wh=>{:Item_Number=>"111168", :Expiry_Date=>"2023-05-09"}}]}

data[:wh_Repeating].sort_by! { |hash| hash[:wh][:Expiry_Date] }

data
#=>   {:wh_Repeating=>               
        [{:wh=>{:Item_Number=>"111167", :Expiry_Date=>"2023-05-01"}},
         {:wh=>{:Item_Number=>"111166", :Expiry_Date=>"2023-05-05"}},
         {:wh=>{:Item_Number=>"111168", :Expiry_Date=>"2023-05-09"}}]}
6mzjoqzu

6mzjoqzu3#

我假设原始哈希值(下面的h)不会被变异(修改)。

h = { :wh_Repeating=>[
        {:wh=>{:Item_Number=>"111166", :Expiry_Date=>"2023-05-05"}},
        {:wh=>{:Item_Number=>"111167", :Expiry_Date=>"2023-05-01"}},
        {:wh=>{:Item_Number=>"111168", :Expiry_Date=>"2023-05-09"}}
      ]
    }

由于此哈希值只有一个键(:wh_Repeating),我们可以简单地将所需哈希值的结构写为

{ :wh_Repeating=>... }

然后计算:wh_Repeating的值。

{ :wh_Repeating=>h[:wh_Repeating].sort_by { |g| g[:wh][:Expiry_Date] } }
  #=> { :wh_Repeating=>[
  #       {:wh=>{:Item_Number=>"111167", :Expiry_Date=>"2023-05-01"}},
  #       {:wh=>{:Item_Number=>"111166", :Expiry_Date=>"2023-05-05"}},
  #       {:wh=>{:Item_Number=>"111168", :Expiry_Date=>"2023-05-09"}}
  #     ]
  #   }

原始散列h未改变,这可以容易地验证。

相关问题