我有一个嵌套的哈希,我需要返回内部哈希,它是键的值。问题在于值之一是字符串,需要将其作为整数返回。
def player_stats(player_name)
game_hash.keys.each do |data|
if game_hash[data][:players].keys.include?(player_name)
return game_hash[data][:players][player_name]
end
end
end
game_hash = {
:home => {team_name:"Brooklyn Nets", colors:["Black", "White"],
:players => {"Alan Anderson" => {:number => 0, :shoe => "16",
:points => 22, :rebounds => 12, :assists =>12, :steals => 3,
:blocks => 1, :slam_dunks => 1},
代码是正确的,唯一的是我需要输入将字符串**(:shoe)**转换为整数的行。
答案 0 :(得分:0)
game_hash = {
:home => {:team_name =>"Brooklyn Nets",
:colors => ["Black", "White"],
:players => {
"Alan Anderson" => {
:number => 0,
:shoe => "16",
:points => 22,
}
}
}
}
在这种情况下,假设您不想突变(修改)原始哈希,最简单的是首先制作game_hash
的深层副本:
h = Marshal.load(Marshal.dump(game_hash))
#=> {:home=>{:team_name=>"Brooklyn Nets", :colors=>["Black", "White"],
# :players=>{"Alan Anderson"=>{:number=>0, :shoe=>"16", :points=>22}}}}
请参见Marshall::load和Marshall::dump。
然后只需修改感兴趣的值:
h[:home][:players]["Alan Anderson"][:shoe] =
h[:home][:players]["Alan Anderson"][:shoe].to_i
h #=> {:home=>{:team_name=>"Brooklyn Nets", :colors=>["Black", "White"],
# :players=>{"Alan Anderson"=>{:number=>0, :shoe=>16, :points=>22}}}}
最后,让我们确认原始哈希没有突变:
game_hash
#=> {:home=>{:team_name=>"Brooklyn Nets", :colors=>["Black", "White"],
# :players=>{"Alan Anderson"=>{:number=>0, :shoe=>"16", :points=>22}}}}
答案 1 :(得分:0)
在您的代码之后,仅作了几处更改(请参阅下面选项中的内联注释)。
给出game_hash
,它在某处可能有整数作为字符串:
game_hash = {:home => { team_name:"Brooklyn Nets", colors:["Black", "White"],:players => {"Alan Anderson" => {:number => "0", :shoe => "16", :points => 22, :rebounds => 12, :assists =>12, :steals => 3, :blocks => 1, :slam_dunks => 1},"Reggie Evans" => {:number => "30",:shoe => "14",:points => 12, :rebounds => 12, :assists => 12, :steals => 12, :blocks => 12, :slam_dunks => 7}}}}
这是选项:
def player_stats(player_name, game_hash) # <-- pass game_hash as parameter
game_hash.keys.each do |data|
if game_hash[data][:players].keys.include?(player_name)
return game_hash[data][:players][player_name].transform_values { |v| v.to_i } # <-- transform values to integer
end
end
end
然后,您可以致电:
player_stats("Reggie Evans", game_hash)
#=> {:number=>30, :shoe=>14, :points=>12, :rebounds=>12, :assists=>12, :steals=>12, :blocks=>12, :slam_dunks=>7}
答案 2 :(得分:0)
我想在您的#player_stats
方法中指出一些“问题”,但我将重点介绍将玩家哈希值转换为整数的问题。首先,我要进行以下假设:
Integer
类型或String
类型的整数形式。我想指出的一件事是,鞋子的大小可以是9.5
或10.5
,依此类推。这可能是鞋子值被格式化为字符串的原因。如果是这种情况,那么您需要考虑到这一点,并使用#to_f
而不是#to_i
转换为浮点数。但是由于您的问题是要求它是整数,因此在下面的示例中,我将使用#to_i
。
根据我的假设,您只需遍历玩家哈希中的所有值,然后对值调用#to_i
即可将其转换为整数。可以使用以下方法完成此操作:
def convert_hash_values_to_int(hash)
hash.each do |key, value|
hash[key] = value.to_i
end
end
您可以在#player_stats
方法内调用此方法。 请注意,此方法会在不创建新哈希的情况下就地改变原始哈希值。如果不希望这样做,则应使用#inject
:
def convert_hash_values_to_int(hash)
hash.inject({}) do |result, (key, value)|
result[key] = value.to_i
result
end
end
这将使用转换后的值创建一个新的哈希,然后将其返回。
使用#each_with_object
可以进一步简化该操作,该操作还会创建一个新的哈希而不是对原始哈希进行突变:
def convert_hash_values_to_int(hash)
hash.each_with_object({}) do |(key, value), result|
result[key] = value.to_i
end
end
此方法不需要您在每个循环中返回result
。请注意,参数切换为#each_with_object
-|(key, value), result|
而不是|result, (key, value)|
。
您还可以使用另一种方法,它最简洁,但仅在Ruby 2.4+中可用:
def convert_hash_values_to_int(hash)
hash.transform_values do |value|
value.to_i
end
end
哪个更简洁:
def convert_hash_values_to_int(hash)
hash.transform_values(&:to_i)
end
#transform_values
不会变异原始哈希。如果您想更改原始哈希,则需要使用bang:
def convert_hash_values_to_int(hash)
hash.transform_values!(&:to_i)
end