Преобразование глубокого вложенного хэша в многомерный массив в ruby - PullRequest
0 голосов
/ 17 мая 2018

Я хочу преобразовать вложенные хэши в рекурсивные многомерные массивы.

Это мой текущий код:

def deep_to_a(hash)
  return  hash.to_a.each {|k, v|
    if k.is_a?(Hash) then
      hash[k.to_a] = hash.delete(k)
      deep_to_a(k)
    elsif v.is_a?(Hash) then
      hash[k] = hash[k].to_a
      if hash[k].any?{|k, v| k.is_a?(Hash) || v.is_a?(Hash)}
        deep_to_a(v)
      end
    end
  }
end

Я хочу получить:

h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h) # => [[11, [[12, 13], [14, 15]]], [16, 17]] 

Но я получаю

[[11, {12=>13, 14=>15}], [16, 17]]

Как я могу заставить это работать?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018
def deep_to_a(h)
  h.map { |k,v| [k, Hash === v ? deep_to_a(v) : v] }
end

deep_to_a({11=>{12=>13, 14=>15}, 16=>17})
  #=> [[11, [[12, 13], [14, 15]]], [16, 17]]
0 голосов
/ 17 мая 2018

Деструктивную функцию трудно отладить.В этом случае map лучше, чем each + деструктивное присваивание.

Результатом hash.to_a является массив, поэтому ваша итерация |k, v| неверна.

def deep_to_a(hash)
  hash.map do |v|
    if v.is_a?(Hash) or v.is_a?(Array) then
      deep_to_a(v)
    else
      v
    end
  end
end

h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h)
# [[11, [[12, 13], [14, 15]]], [16, 17]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...