Ruby中对含datetime字段的对象数组按日期排序失败如何解决
数组按datetime排序失效问题解决
失效核心原因
你使用的tracking_events.sort { |te| te.datetime }写法不符合Ruby标准Array#sort的方法规则:
Array#sort要求传入的块接收两个参数(分别对应待比较的两个数组元素),块需要返回-1、0、1的比较结果来判定两个元素的顺序。- 你只给块传入了1个参数,每次比较时第二个元素会被直接忽略,块返回的datetime对象为真值,Ruby会判定所有元素的比较结果相等,因此不会调整数组顺序,看起来就像排序完全没生效。
- 你之前尝试将datetime转整数后排序仍失效,也是因为同样的单参数块用法错误,和datetime的类型无关。
正确实现方案
如果要按单属性做排序,更推荐使用Array#sort_by方法,它天然支持单参数块返回排序用的键值,性能也优于手动写sort比较块:
升序(时间从早到晚)
# 写法1:完整块写法,可兼容自定义逻辑 sorted_events = tracking_events.sort_by { |event| event.datetime } # 写法2:符号简写,属性名和方法名一致时可用 sorted_events = tracking_events.sort_by(&:datetime)
降序(时间从晚到早)
# 写法1:升序结果反转,性能最优 sorted_events = tracking_events.sort_by(&:datetime).reverse # 写法2:用sort方法写双参数比较块 sorted_events = tracking_events.sort { |a, b| b.datetime <=> a.datetime }
原地修改原数组
上述方法默认返回新数组,不会修改原tracking_events数组,如果需要直接修改原数组,使用对应带!的方法即可:
# 原地升序排序 tracking_events.sort_by!(&:datetime)
内容的提问来源于stack exchange,提问作者Brandon Teixeira
相关产品推荐
相关产品推荐

