红宝石字符串数组到哈希



在Ruby中,如何将数组转换为哈希? 我有这样的数组

people = [
{"name":"Sam","year":"21"},
{"name":"cole","partition":"20"},
{"name":"bart","year":"21"}
]

我想把这个数组放在一个哈希中,如下所示,这样我就可以检查谁是 21:

{
person1 => {"name"=>"Sam","year"=>"21"},
person2 => {"name"=>"cole","partition"=>"20"},
person3 => {"name"=>"bart","year"=>"21"}
}

如何将此数组转换为哈希?我如何检查谁是 21 岁?

您可以使用each_with_object来迭代"peaple",并使用前缀person加上当前元素的索引作为键,将当前元素分配给新哈希。

peaple
.each_with_object({})
.with_index(1) do |(person, hash), index|
hash["person#{index}"] = person
end
# {"person1"=>{:name=>"Sam", :year=>"21"},
#  "person2"=>{:name=>"cole", :partition=>"20"},
#  "person3"=>{:name=>"bart", :year=>"21"}}

出于好奇的另一个版本是创建一个具有相同长度的"peaple"的字符串数组,其值为前缀"person"加上其索引加1。使用当前值压缩它并在其上调用to_h会得到相同的结果:

Array.new(peaple.length) { |i| "person#{i + 1}" }.zip(peaple).to_h

如果这个想法是通过使用"year"键来获取谁是21,那么您可以选择那些带有年份21的元素并映射它们的名称:

peaple
.select { |person| person[:year] == "21" }
.map { |person| person[:name] }
# ["Sam", "bart"]

首先,它恰好拼写为"人";)

由于需要生成键person1person2等,我将遍历您的原始数组,将每个元素放入具有适当键的新哈希中:

people_hash = {}
people.each_with_index do |person, index|
next unless person[:year] == 21 # This will skip any element that doesn't have an :age of 21
people_hash["person#{index + 1}"] = person
end
people_hash
#=> {"person1"=>{:name=>"Sam", :year=>"21"}, "person2"=>{:name=>"cole", :partition=>"20"}, "person3"=>{:name=>"bart", :year=>"21"}}

each_with_index方法将遍历数组的每个元素,但也将提供元素的当前索引,以便我们可以将其用于哈希键。我使用字符串内插来创建哈希键 - 由于您想从 1 开始,所以我每次都向索引添加 1。

最新更新