我有一个可以任意大的哈希对象 - 键总是字符串,但值可以是字符串,数组或其他哈希值。我想递归遍历对象,如果任何特定键的值(或任何数组的值)是一个字符串,我想剥去行结尾和前导和尾随空格(\ r \ n,\ t,等等“ )
我是否需要自己编写此算法或者是否有更快的ruby-esque方法来执行此操作?
答案 0 :(得分:2)
您需要自己编写。一种方法是:
def strip_hash_values!(hash)
hash.each do |k, v|
case v
when String
v.strip!
when Array
v.each {|av| av.strip!}
when Hash
strip_hash_values!(v)
end
end
end
此方法修改原始哈希:
hash = {:a => [" a ", " b ", " c "], :b => {:x => "xyz "}, :c => "abc "}
strip_hash_values!(hash)
puts hash
# returns {:b=>{:x=>"xyz"}, :c=>"abc", :a=>["a", "b", "c"]}
答案 1 :(得分:1)
这是一种方法。
<强>代码强>
def strip_strings(o)
case o
when Hash
o.each do |k,v|
o[k] = case v
when String
v.strip
else
strip_strings(v)
end
end
else # Array
o.map do |e|
case e
when String
e.strip
else
strip_strings(e)
end
end
end
end
示例强>
h = { a: [b: { c: " cat ", d: [" dog ", {e: " pig " }] }], f: " pig " }
#=> {:a=>[{:b=>{:c=>" cat ", :d=>[" dog ", {:e=>" pig "}]}}], :f=>" pig "}
strip_strings(h)
#=> {:a=>[{:b=>{:c=>"cat", :d=>["dog", {:e=>"pig"}]}}], :f=>"pig"}