我正在寻找将 Ruby 哈希中的值从字符串转换为整数。
我认为这与您在 Ruby 数组中执行转换的方式非常相似(使用 map 方法),但我无法找到一个优雅的解决方案,它不涉及将哈希转换为数组,将其展平, ETC。
有没有一个干净的解决方案来做到这一点?
例如。从
x = { "a" => "1", "b" => "2", "c"=> "3" }
到
x = { "a" => 1, "b" => 2, "c" => 3 }
为避免修改原始哈希(与现有答案不同),我会使用
newhash = x.reduce({}) do |h, (k, v)|
h[k] = v.to_i and h
end
如果您使用的是 Ruby 1.9,您还可以使用Enumerable#each_with_object
更简洁地实现相同的效果。
newhash = x.each_with_object({}) do |(k, v), h|
h[k] = v.to_i
end
如果需要,您还可以将逻辑提取到模块中并Hash
用它扩展类。
module HMap
def hmap
self.each_with_object({}) do |(k, v), h|
h[k] = yield(k, v)
end
end
end
class Hash
include HMap
end
现在你可以使用
newhash = x.hmap { |k, v| v.to_i } # => {"a"=>1, "b"=>2, "c"=>3}
我的首选解决方案:
Hash[x.map { |k, v| [k, v.to_i]}] #=> {"a"=>1, "b"=>2, "c"=>3}
A somewhat wasteful one (has to iterate over the values twice):
Hash[x.keys.zip(x.values.map(&:to_i))] #=> {"a"=>1, "b"=>2, "c"=>3}
试试这个:
x.each{|k,v| x[k]=v.to_i}
p.keys.map { |key| p[key] = p[key].to_i }