-1

我正在尝试做一个让我现在很难过的小实验。

我创建了新的哈希

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

然而,这只会将前一个哈希的最后一个值附加到新哈希的 out 和 in 中。

我想要做的是使用 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

纳克斯

4

1 回答 1

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
于 2012-11-22T20:51:06.317 回答