在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"]
首先,它恰好拼写为"人";)
由于需要生成键person1
、person2
等,我将遍历您的原始数组,将每个元素放入具有适当键的新哈希中:
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。