ruby - 如何更改嵌套哈希的格式

标签 ruby

我正在寻找如何编写 format 函数的解决方案,该函数将字符串或嵌套哈希作为参数,并以路径作为键返回它的扁平化版本。

arg = "foo"
format(arg) # => { "hash[keys]" => "foo" }

arg = {:a => "foo", :b => { :c => "bar", :d => "baz" }}
format(arg) # => { "hash[keys][a]" => "foo", "hash[keys][b][c]" => "bar", "hash[keys][b][d]" => "baz" }

最佳答案

def hash_flatten h
  h.inject({}) do |a,(k,v)|
    if v.is_a?(Hash)
      hash_flatten(v).each do |sk, sv|
        a[[k]+sk] = sv
      end
    else
      k = k ? [k] : []
      a[k] = v
    end
    a
  end
end

def format h
  if h.is_a?(Hash)
    a = hash_flatten(h).map do |k,v|
      key = k.map{|e| "[#{e}]"}.join
      "\"event[actor]#{key}\" => \"#{v}\""
    end.join(', ')
  else
    format({nil => h})
  end
end

arg = "sth"
puts format(arg)
# => "event[actor]" => "sth"

arg = {:a => "sth", :b => { :c => "sth else", :d => "trololo" }}
puts format(arg)
# => "event[actor][a]" => "sth", "event[actor][b][c]" => "sth else", "event[actor][b][d]" => "trololo"

关于ruby - 如何更改嵌套哈希的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3237107/

相关文章:

ruby - 您可以对带有插值的字符串使用 ruby​​ 百分比表示法吗?

ruby - ABC 大小太高,即使没有分支、赋值或条件

ruby - 制作一个不是 gem(或其他类型)的 Ruby 项目

ruby - Ember.js、Rails 和通配符子域

CSS 没有出现在 ERB 中

ruby - gets.chomp 不换行

ruby-on-rails - 类型错误 : can't cast Array to string

ruby-on-rails - 注销时当前用户的模型上出现 Ruby 无方法错误

ruby - 如何在 sinatra 中引发自定义错误代码?

ruby - 在 Ruby 中获取整数数组的最小公倍数