我有一个哈希,它是MySQL2 :: Result对象上.map
方法的结果,如下所示:
{#<Date: 2018-01-02 ((2458121j,0s,0n),+0s,2299161j)>=>"OL,BD,DM,WW,DG"}
{#<Date: 2018-01-03 ((2458122j,0s,0n),+0s,2299161j)>=>"KP,LW"}
{#<Date: 2018-01-04 ((2458123j,0s,0n),+0s,2299161j)>=>"LW,WW,FS,DG"}
{#<Date: 2018-01-05 ((2458124j,0s,0n),+0s,2299161j)>=>"OL,KP,BD,SB,LW,DM,AS,WW,FS,DG"}
{#<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>=>"OL,KP,BD,SB,LW,DM,AS,WW,FS,DG"}
我想通过引用键从哈希中提取值(两个字母项)。
我试过了
puts hash_name["2018-01-06"]
puts hash_name['2018-01-06']
puts hash_name[Date.new(2018,1,6)]
puts hash_name["<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>"]
puts hash_name["#<Date: 2018-01-06 ((2458125j,0s,0n),+0s,2299161j)>"]
全部没有返回任何内容或错误。
通过执行以下操作创建哈希:
hash_name = @available_items.map do
|h| {h["tdate"] => h["items"] }
end
在创建哈希期间我可以做些什么,或者现在,能够使用例如哈希值轻松地拉出值。我可以将其转换为其他日期格式,如ISO格式吗?
由于
答案 0 :(得分:2)
我认为您的问题是Enumerable#map
没有按照您的想法行事。这样:
hash_name = @available_items.map do
|h| {h["tdate"] => h["items"] }
end
将为您提供单个条目哈希的数组,单个哈希会将日期映射到字符串,但结果如下所示:
[
{ date1 => string1 },
{ date2 => string2 },
...
]
而不是:
{
date1 => string1,
date2 => string2,
...
}
正如你所期待的那样。切换到#each_with_object
应该会解决您的问题:
hash_name = @available_items.each_with_object({}) do |row, h|
h[row['tdate']] = row['items']
end
答案 1 :(得分:1)
你在这附近,但你正在生成一个哈希数组,而不是单数哈希:
hash_name = @available_items.map do |i|
[ i["tdate"], i["items"] ]
end.to_h
这将创建一个键/值对数组数组,然后使用.to_h
方法将它们转换为哈希值。
如果您的输入数据可以整齐分组,也可以使用group_by
,例如:
hash_name = @available_items.group_by do |i|
i['tdate']
end
如果可以处理输出格式,那么该方法可能足够好。它是按日期键入的。
请注意,使用:tdate
和:items
等符号键通常比字符串键更可取。在大多数情况下,重复那些字符串的情况下,值得尝试引导它。
答案 2 :(得分:0)
希望这可以帮助别人做类似的事情,这就是我最终做的事情。
我有一个如上所示的MySQL2 :: Result对象,我在其上运行:
@available_hash = @available_items.map do |row|
[ row["tdate"], row["available"] ]
end.to_h
先前已声明start_date
和end_date
我然后从列表中随机选择一个可用项目,以使用日期作为键填充新哈希:
$final_hash = Hash.new("")
for date in (start_date..end_date)
@available_today = @available_hash[date].to_s.split(",")
$final_hash[date] = random_item(@available_today)
date +=1;
end
虽然我确信这可能是一种更优雅的方式,但我很高兴你能帮助我实现这一目标!
答案 3 :(得分:-1)
显然哈希映射不适合作为密钥的日期,哈希映射更适合作为id,tag等的密钥。它应该是唯一的密钥。
请提供有关您对此哈希映射需要执行的操作的更多信息,以确保您可以拥有更聪明的数据结构。
如果您有一个包含两个键(tdate,items)的数组,并且您想要查找日期,请使用select:
result = available_items.select { |elem| elem['tdate'] === Date.new(2001,2,3) }
在Date类中引用'==='运算符 http://ruby-doc.org/stdlib-2.1.1/libdoc/date/rdoc/Date.html#method-i-3D-3D-3D