You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题分析及解决方案

问题原因

  1. 键类型不匹配:Ruby解析后的哈希使用符号键(:wh_Repeating),但代码中用字符串键("wh_Repeating")取值,导致返回nil,调用sort_by时触发错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:03:07