如何迭代嵌套的Ruby哈希以基于现有键/值数据添加新的键/值对?

问题描述 投票:1回答:3
  1. 我有一个嵌套的数据散列:
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"}
}
  1. 我想遍历每个成员的哈希,并在嵌套哈希中查找他们的年龄。

  2. 对于每个成员,我想将一个新的键/值对添加到名为“ age_group”的现有嵌套哈希中。

  3. 每个成员的“年龄组”的值取决于他们的年龄。例如,如果年龄在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
ruby hash
3个回答
2
投票

除了@MurifoX答案,您还可以使用#transform_values

#transform_values

1
投票

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位置。


0
投票
k

def age_group(age)
  case age
  when 0..17 then "kid"
  when 18..64 then "adult"
  else "senior"
  end
end

第一个块变量是键(“ Herman”,“ Lily”,依此类推)。我选择用下划线(有效的局部变量名称)来表示它,主要是向读者表明在块计算中未使用它。这是惯例。

© www.soinside.com 2019 - 2024. All rights reserved.