我正在尝试做一个让我难倒的小实验。
我创建了新的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
但是,这只会将前一个哈希的最后一个值附加到新哈希中的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 }}
}
另外 - 我应该使用Hashes这个还是阵列?我想最终将其导出为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 :(得分: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