Ruby中如何按过期日期排序哈希数组?新手技术求助
Ruby按Expiry_Date排序JSON数据问题解决
我是Ruby新手,需要按Expiry_Date(过期日期)排序产品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"}} ]}
尝试的代码及报错
尝试的代码:
sorted = jsonIn["wh_Repeating"] sorted.sort_by { |k,v| v[:"Expiry_Date"] } puts sorted
报错信息(翻译后):
未定义方法 `sort_by' 用于 nil:NilClass (NoMethodError)
问题分析及解决方案
问题原因
- 键类型不匹配:Ruby解析后的哈希使用符号键(
:wh_Repeating),但代码中用字符串键("wh_Repeating")取值,导致返回nil,调用sort_by时触发错误。 sort_by块参数错误:数组中的每个元素是单个哈希(键为:wh),不是键值对k,v,无法直接通过v获取Expiry_Date。
正确代码示例
完整流程(从JSON字符串到排序)
require 'json' # 原始JSON字符串 json_str = <<~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" } }]} JSON # 解析JSON为符号键哈希 json_in = JSON.parse(json_str, symbolize_names: true) # 获取产品数组(使用符号键) products = json_in[:wh_Repeating] # 按Expiry_Date升序排序(YYYY-MM-DD格式字符串可直接比较) sorted_products = products.sort_by { |item| item[:wh][:Expiry_Date] } # 输出排序结果 puts sorted_products.inspect
如果已解析好哈希
# 假设json_in是已解析的符号键哈希 sorted_products = json_in[:wh_Repeating].sort_by { |item| item[:wh][:Expiry_Date] } puts sorted_products.inspect
补充说明
- 因为日期格式是
YYYY-MM-DD,字符串的字典序和日期的时间序一致,直接用字符串比较即可完成正确排序。 - 如果需要降序排序,可在
sort_by后加.reverse,或使用sort配合<=>运算符:
# 降序排序 sorted_products_desc = products.sort { |a,b| b[:wh][:Expiry_Date] <=> a[:wh][:Expiry_Date] }
内容的提问来源于stack exchange,提问作者Leon Hogarth
相关产品推荐
相关产品推荐

