在多维哈希中查找和替换 - Ruby

问题描述 投票:3回答:2

如果你拿哈希:

{
   :element => {
      :to_find => 'found me'
   },
   :element_2 => {
      :inner_element => {
         :n_elements => {
            :to_find => 'found me'
         }
       :do_not_touch => 'still here'
      }
   }
}

我怎样才能找到并用'changed'替换:to_find?

我试过了

(hash).update(hash){|k,v| (([:to_find].include? k) ? 'changed' : v}

然而这只是一个深刻的。

我可以做一个递归函数,如:

def change_keys(hash, keys, new_value)
   (hash).update(hash) do |k,v| 
       if (keys.include? k) 
         new_value
       else
          if v.class == Hash 
            find_key(v)
          else
            v
          end
       end
    end
end

我测试过运行这个,有效:

change_keys(my_hash, [:to_find], 'changed')

但是,有更干净的方式吗?

ruby hash
2个回答
3
投票

递归方法是可行的方法,但你可以让它更清洁......

def change_keys(hash, keys, new_value)
    keys.each { |k|  hash[k] = new_value if hash.has_key?(k) }
    hash.values.each { |v| change_keys(v, keys, new_value)  if v.class == Hash }
end

0
投票

我想你可以尝试这样的事情

eval({
  :x => 'y',
  :q => 
  {
    :x => 'y',
    :s => 
      {
        :x => 'y'
      }
  }
}.to_s.gsub(/:x=>"."/, ':x=> "new_value"')
)
© www.soinside.com 2019 - 2024. All rights reserved.