Ruby:如何将Time实例数组转换为指定结构的哈希表?
实现方法(Ruby示例)
嘿,这个需求用Ruby来实现非常直观,我给你一步步拆解:
步骤1:准备数据
首先把你的Time实例数组定义好(实际项目里你可以直接用已有数组):
time_array = [ Time.new(2018, 5, 23, 8, 0, 0), Time.new(2018, 5, 23, 8, 30, 0), Time.new(2018, 5, 23, 9, 30, 0), Time.new(2018, 5, 24, 15, 0, 0), Time.new(2018, 5, 24, 15, 30, 0) ]
步骤2:按日期分组并过滤(可选)
从你的期望结果来看,2018-05-23只保留了9点前的时间,2018-05-24没有保留任何时间,这里我们可以先按日期分组,再过滤掉不符合要求的时间:
# 按日期字符串分组,同时过滤出上午9点前的时间并转成指定字符串格式 grouped_data = time_array.group_by do |time| time.strftime("%Y-%m-%d") # 把Time实例转成"YYYY-MM-DD"格式的日期字符串作为键 end.transform_values do |times| # 只保留小时小于9的时间,再转成你需要的字符串格式 times.select { |t| t.hour < 9 }.map { |t| t.strftime("%Y-%m-%d %H:%M:%S") } end
步骤3:确保目标日期都在结果中
如果需要指定必须包含的日期(比如不管有没有符合条件的时间都要显示),可以遍历目标日期列表构建最终哈希:
# 定义你需要包含的目标日期 target_dates = ["2018-05-23", "2018-05-24"] # 构建最终结果哈希,没有对应数据的日期设为空数组 result = target_dates.each_with_object({}) do |date, hash| hash[date] = grouped_data[date] || [] end # 输出结果 p result # => {"2018-05-23"=>["2018-05-23 08:00:00", "2018-05-23 08:30:00"], "2018-05-24"=>[]}
补充说明
- 如果不需要过滤时间(只是示例里的期望输出写错了),删掉
select { |t| t.hour < 9 }这部分即可,这样2018-05-24就会包含对应的两个时间字符串。 - 如果不需要指定固定日期,想自动包含原数组中所有出现过的日期,可以把
target_dates换成:target_dates = time_array.map { |t| t.strftime("%Y-%m-%d") }.uniq
内容的提问来源于stack exchange,提问作者Noémie Harvey
相关产品推荐
相关产品推荐

