Строка для массива в многомерный хеш в ruby - PullRequest
4 голосов
/ 26 января 2012

Я действительно не знаю, если заголовок правильный, но вопрос довольно прост:

У меня есть значение и ключ.

Ключ выглядит следующим образом:

"one.two.three"

Теперь, как мне установить этот хэш:

params['one']['two']['three'] = value

Ответы [ 3 ]

1 голос
/ 26 января 2012

Использовать рекурсию:

def make_hash(keys)
  keys.empty? ? 1 : { keys.shift => make_hash(keys) }
end

puts make_hash("one.two.three".split '.')
# => {"one"=>{"two"=>{"three"=>1}}}
1 голос
/ 26 января 2012

Вы можете использовать метод inject:

key = "one.two.three"
value = 5

arr = key.split(".").reverse
arr[1..-1].inject({arr[0] => value}){ |memo, i| {i => memo} }
# => {"one"=>{"two"=>{"three"=>5}}}
1 голос
/ 26 января 2012

Вы можете попробовать сделать это с помощью этого кода:

keys = "one.two.three".split '.' # => ["one", "two", "three"]
params = {}; value = 1; i = 0;  # i is an index of processed keys array element
keys.reduce(params) { |hash, key|
    hash[key] = if (i += 1) == keys.length
      value # assign value to the last key in keys array
    else
      hash[key] || {} # initialize hash if it is not initialized yet (won't loose already initialized hashes)
    end
}
puts params # {"one"=>{"two"=>{"three"=>1}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...