递归地从ruby散列中的字符串值中删除行结尾

时间:2014-07-10 19:55:45

标签: ruby

我有一个可以任意大的哈希对象 - 键总是字符串,但值可以是字符串,数组或其他哈希值。我想递归遍历对象,如果任何特定键的值(或任何数组的值)是一个字符串,我想剥去行结尾和前导和尾随空格(\ r \ n,\ t,等等“ )

我是否需要自己编写此算法或者是否有更快的ruby-esque方法来执行此操作?

2 个答案:

答案 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"}