我想value用哈希替换每个哈希value.some_method.
例如,对于给定的简单哈希:
{"a" => "b", "c" => "d"}`
Run Code Online (Sandbox Code Playgroud)
每个值都应该是.upcased,所以它看起来像:
{"a" => "B", "c" => "D"}
Run Code Online (Sandbox Code Playgroud)
我试过#collect,#map但总是把数组拿回来.有一种优雅的方式来做到这一点?
UPDATE
该死的,我忘记了:哈希是一个不应该改变的实例变量.我需要一个带有更改值的新哈希,但是不希望显式定义该变量,然后遍历填充它的哈希.就像是:
new_hash = hash.magic{ ... }
Run Code Online (Sandbox Code Playgroud)
kch*_*kch 206
my_hash.each { |k, v| my_hash[k] = v.upcase }
Run Code Online (Sandbox Code Playgroud)
或者,如果您更喜欢非破坏性地执行此操作,并返回新的哈希而不是修改my_hash:
a_new_hash = my_hash.inject({}) { |h, (k, v)| h[k] = v.upcase; h }
Run Code Online (Sandbox Code Playgroud)
最后一个版本还有一个额外的好处,你也可以转换键.
pot*_*hin 88
由于ruby 2.4.0您可以使用本机Hash#transform_values方法:
hash = {"a" => "b", "c" => "d"}
new_hash = hash.transform_values(&:upcase)
# => {"a" => "B", "c" => "D"}
Run Code Online (Sandbox Code Playgroud)
还有破坏性的Hash#transform_values!版本.
End*_*del 33
您可以收集值,并再次将其从Array转换为Hash.
像这样:
config = Hash[ config.collect {|k,v| [k, v.upcase] } ]
Run Code Online (Sandbox Code Playgroud)
Kon*_*che 23
这样做:
my_hash.each_with_object({}) { |(key, value), hash| hash[key] = value.upcase }
Run Code Online (Sandbox Code Playgroud)
inject与优势相反,您无需在块内再次返回哈希.
Chr*_*ett 10
试试这个功能:
h = {"a" => "b", "c" => "d"}
h.each{|i,j| j.upcase!} # now contains {"a" => "B", "c" => "D"}.
Run Code Online (Sandbox Code Playgroud)
sch*_*jos 10
在ActiveSupport v4.2.0中有一种方法.它被调用transform_values,基本上只是为每个键值对执行一个块.
因为他们正在这样做,each我认为没有比循环更好的方法了.
hash = {sample: 'gach'}
result = {}
hash.each do |key, value|
result[key] = do_stuff(value)
end
Run Code Online (Sandbox Code Playgroud)
更新:
从Ruby 2.4.0开始,你就可以使用#transform_values和#transform_values!.