2012-11-22 157 views
-1

我正在尝试做一个小实验,让我在此刻陷入困境。将值添加到哈希红宝石中的哈希值

我创建了新的Hash

tt = Hash.new() 

然后,添加两个散列里面的钥匙:

tt.merge!(:in => Hash.new) 
tt.merge!(:out => Hash.new) 

所以我有一个哈希看起来像这样:

{ 
    :in => {}, 
    :out => {} 
} 

现在我有另一个叫做res的哈希散列,我遍历并在每个散列上执行IF语句:

res.each do |x| 
    if x[:id] == nil 
     tt[:out].merge!(x) 
    else 
     tt[:in].merge!(x) 
end 
end 

但是,这只会将前一个散列的最后一个值附加到新散列的内部和外部。

我所要做的是使用IF语句提出了新的哈希

所以它结束了看起来像IN或OUT的项下:

{ 
    :in => {{:1 => 1 ,:2 => 1 ,:3 => 1 ,:4 => 1 ,:5 => 1 },{:1 => 1 ,:2 => 1 ,:3 => 1 ,:4 => 1 ,:5 => 1 }}, 
    :out => {{:1 => 1 ,:2 => 1 ,:3 => 1 ,:4 => 1 ,:5 => 1 }, {:1 => 1 ,:2 => 1 ,:3 => 1 ,:4 => 1 ,:5 => 1 }} 
} 

而且 - 我应该使用哈希这个或数组?我想将它最终导出为JSON。

例如,这可以工作。但不知道这是否是正确的:

tt = Hash.new(:in => Hash.new, :out => Hash.new) 
tt.merge!(:in => Array.new) 
tt.merge!(:out => Array.new) 
ap tt.class 
res.each do |x| 
    if x[:id] == nil 
     tt[:out] << x 
    else 
     tt[:in] << x 
end 
end 

Thnaks

+0

你说'res'是一个散列,但你的'res.each'只包含一个参数。通常你需要两个:键和值。你可以发布一个'res'的例子吗? – knut

回答

0

这是不可能的。你正在谈论{1,2,3,4,5}作为散列,但它是不是散列,它是一个数组。如果您没有与值关联的特定键,则不会有类似散列的数据。你使用数组的第二个版本是正确的(除了使用merge ...请参见下文)。

此外,如果你想添加一些散列,你应该使用[]运算符,而不是重复使用merge

例如,这是错误的:

tt = Hash.new() 
tt.merge!(:in => Hash.new) 
tt.merge!(:out => Hash.new) 

你想要什么或者是这样的:

tt = Hash.new() 
tt[:in] = Hash.new 
tt[:out] = Hash.new 

或更好的做法是:

tt = { in: {}, out: {} } 

完整和正确版本的这可能看起来像这样:

tt = Hash.new(in: [], out: []) 

res.each do |x| 
    if x[:id].nil? 
    tt[:out] << x 
    else 
    tt[:in] << x 
end 
+0

谢谢!我已经更新了我的哈希示例对不起,它粘贴错了。他们不只是1,2,3,4 –