2013-05-03 46 views
-1

如何用变量调用哈希值?用变量调用哈希值 - Ruby

我有这样的哈希:data = {"5/3/2013 13:31:13"=>{:open=>65, :closed=>835}}

datasequences.each do |seq_title| 
sequence = Hash.new(0) 
sequence[:title] = seq_title 
sequence_data = Array.new(0) 
data.each do |key, value| 
    puts value[#{seq_title.to_sym}] 
    # More code... 
end 
end 

的每哈希(data)的seq_title值将是open然后closed

例如,如果我改变代码读取

datasequences.each do |seq_title| 
sequence = Hash.new(0) 
sequence[:title] = seq_title 
sequence_data = Array.new(0) 
data.each do |key, value| 
    puts value[:open] 
    # More code... 
end 
end 

在上面的代码红宝石输出65,但我想值[VAR](未硬编码),所以它可以输出65,并通过下一个迭代835 。

+0

'[VARIABLE](:open,then:closed)'是什么意思呢? – 2013-05-03 17:47:46

+0

我想调用哈希的值,就像这个值[#{seq_title.to_sym}],所以value [var]不是硬编码的。在这个例子中,它可能是value [:open]或value [:closed]。 – 2013-05-03 17:48:17

+0

在这种情况下{{2013年5月1日10:42:40“:{”open“:10,”closed“:345},{”2013年5月2日10:42:40“:{”open “:-1,”closed“:700},{”2013年5月3日10:42:40“:{”open“: - 29,”closed“:604}}'您期望什么价值?为什么你不认为'values_at'不会工作? – 2013-05-03 18:05:25

回答

1

你只需要指定一个变量的关键是:

% irb 
irb> data = { "5/3/2013 13:31:13"=>{:open=>65, :closed=>835}, "5/4/2013 14:41:14"=>{:open=>56, :closed=>538} } 
# => {"5/3/2013 13:31:13"=>{:open=>65, :closed=>835}, "5/4/2013 14:41:14"=>{:open=>56, :closed=>538}} 
irb> datasequences = [ :open, :closed ] 
# => [:open, :closed] 
irb> datasequences.each do |seq_title| 
irb| puts "seq_title is #{seq_title.inspect}" 
irb| data.each do |key, value| 
irb|  puts "\t#{value[seq_title]} at #{key}" 
irb| end 
irb| end 
seq_title is :open 
    65 at 5/3/2013 13:31:13 
    56 at 5/4/2013 14:41:14 
seq_title is :closed 
    835 at 5/3/2013 13:31:13 
    538 at 5/4/2013 14:41:14 
# => [:open, :closed] 
+0

@에이바你提供的数据较少,希望其他人猜测和回答,当他们回答你时,不断添加你的所有需求。 – 2013-05-03 18:10:22

+0

我不确定@Priti是什么意思。 – 2013-05-03 18:14:02

+1

请删除irb噪音。 – sawa 2013-05-03 18:14:39

0

您需要使用Hash#values_at,如下图所示:

data = {"5/1/2013 10:42:40" => {"open" => 10,"closed" => 345},"5/2/2013 10:42:40" => {"open" => -1,"closed" => 700}} 
datasequences = [ :open, :closed ] 

data.each do |k,v| 
    p v.values_at(*datasequences.map(&:to_s)) 
end 

输出:

[10, 345] 
[-1, 700] 
+0

** Down-voter **问题在哪里? – 2013-05-03 17:58:51

1

由于值本身是一个哈希,打印键和值是这样的:

data.each do |key, value| 
    value.each do |k,v| 
    puts "#{k}: #{v}" 
    end 
    # More code... 
end