munsters = {
"Herman" => { "age" => 32, "gender" => "male" },
"Lily" => { "age" => 30, "gender" => "female" },
"Grandpa" => { "age" => 402, "gender" => "male" },
"Eddie" => { "age" => 10, "gender" => "male" },
"Marilyn" => { "age" => 23, "gender" => "female"}
}
我想遍历每个成员的哈希,并在嵌套哈希中查找他们的年龄。
对于每个成员,我想将一个新的键/值对添加到名为“ age_group”的现有嵌套哈希中。
每个成员的“年龄组”的值取决于他们的年龄。例如,如果年龄在65岁以上,我希望他们的age_group读为“ senior”,等等。
我遇到的问题:
我很困惑,当家庭中每个成员的第一个键都不同时,我将如何仅访问嵌套哈希的“年龄” key_value对。意思是,我不能执行munsters["age"]
之类的操作,因为它返回nil(假设因为嵌套了“年龄”)。
如果我有一个简单的(未嵌套的)哈希,那很简单。非嵌套哈希的示例:
ages = { "Herman" => 32, "Lily" => 30, "Grandpa" => 402, "Eddie" => 10 }
然后我可能会像这样循环:
age_group = {}
ages.each do |k, v|
if v >= 65
puts "#{k}'s age of #{v} makes them a senior!"
age_group.merge!("age_group": "senior")
elsif v > 17 && v < 65
puts "#{k}'s age of #{v} makes them an adult"
age_group.merge!("age_group": "adult")
else
puts "#{k}'s age of #{v} makes them a kid."
age_group.merge!("age_group": "kid")
end
end
对于嵌套哈希,我可以像这样访问整个嵌套哈希:
munsters.each do |k, v|
v.each do |k2, v2|
p "k2 is #{k2} and v2 is #{v2}"
end
end
但是那仍然只会将整个嵌套的哈希值返回给控制台,而不仅仅是年龄:
k2 is age and v2 is 32
k2 is gender and v2 is male
除了@MurifoX答案,您还可以使用#transform_values
#transform_values
ages.transform_values do |value|
if value["age"] >= 65
value["age_group"] = "senior"
elsif value["age"] > 17 && value["age"] < 65
value["age_group"] = "adult"
else
value["age_group"] = "kid"
end
end
也是一个哈希。所以你可以这样:
v
您将带有字符串值的ages.each do |k, v|
if v["age"] > 60
ages[k]["age_group"] = "adult"
else
ages[k]["age_group"] = "kid"
end
end
键添加到年龄哈希的age_group
位置。
k
def age_group(age)
case age
when 0..17 then "kid"
when 18..64 then "adult"
else "senior"
end
end
第一个块变量是键(“ Herman”,“ Lily”,依此类推)。我选择用下划线(有效的局部变量名称)来表示它,主要是向读者表明在块计算中未使用它。这是惯例。