Одна строка для преобразования вложенных хэшей в разделенные точками строки в Ruby? - PullRequest
3 голосов
/ 24 апреля 2010

Какой самый простой метод преобразования YAML в строки, разделенные точками, в Ruby?

Итак, это:

root:
  child_a: Hello
  child_b:
    nested_child_a: Nesting
    nested_child_b: Nesting Again
  child_c: K

К этому:

{
  "ROOT.CHILD_A" => "Hello",
  "ROOT.CHILD_B.NESTED_CHILD_A" => "Nesting",
  "ROOT.CHILD_B.NESTED_CHILD_B" => "Nesting Again",
  "ROOT.CHILD_C" => "K"
}

1 Ответ

13 голосов
/ 24 апреля 2010

Это не однострочник, но, возможно, он подойдет вашим потребностям

def to_dotted_hash(source, target = {}, namespace = nil)
  prefix = "#{namespace}." if namespace
  case source
  when Hash
    source.each do |key, value|
      to_dotted_hash(value, target, "#{prefix}#{key}")
    end
  when Array
    source.each_with_index do |value, index|
      to_dotted_hash(value, target, "#{prefix}#{index}")
    end
  else
    target[namespace] = source
  end
  target
end

require 'pp'
require 'yaml'

data = YAML.load(DATA)
pp data
pp to_dotted_hash(data)

__END__
root:
  child_a: Hello
  child_b:
    nested_child_a: Nesting
    nested_child_b: Nesting Again
  child_c: K

печать

    {"root"=>
      {"child_a"=>"Hello",
       "child_b"=>{"nested_child_a"=>"Nesting", "nested_child_b"=>"Nesting Again"},
       "child_c"=>"K"}}
    {"root.child_c"=>"K",
     "root.child_b.nested_child_a"=>"Nesting",
     "root.child_b.nested_child_b"=>"Nesting Again",
     "root.child_a"=>"Hello"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...