Извлеките значения из хэша данных Ruby и объедините значения в одну непрерывную строку

#ruby #ruby-on-rails-6.1

Вопрос:

В настоящее время я работаю над программой Ruby on Rails, и мне нужна небольшая помощь в определении метода для получения вложенного хэша, извлечения значений и объединения этих значений в одну строку.

Примером хэша может быть:

 h={a:"da",b:{c:"test",e:{f:"bird"}},d:"duck"}
 

Я бы хотел, чтобы входные данные выглядели так:

 "datestbirdduck"
 

Сможет ли кто-нибудь помочь с метододом, который может это сделать. У меня возникли некоторые проблемы с поиском чего-либо, что работает для вложенного хэша.

Ответ №1:

Поскольку ваш ввод ( h ) представляет собой хэш, который может содержать хэши в своих значениях, вы можете реализовать метод извлечения строк из значений с помощью рекурсии:

 input = {a: "da", b: {c:"test", e: {f: "bird"}}, d:"duck"}

def extract_values_from_hash(input)
  return input unless input.is_a?(Hash)

  input.flat_map { |_, v| extract_values_from_hash(v) }
end

extract_values_from_hash(input).join
# datestbirdduck
 

Что он делает, так это получает хэш ( input ), из которого извлекает значения, добавляя предложение guard — в качестве базового случая, которое возвращает аргумент, с которым был вызван метод, если это объект хэша, в противном случае он выравнивает и сопоставляет объект, вызывающий сам метод. Таким образом, вы извлекаете каждое значение из начального аргумента метода.

Обратите внимание, что это извлекает все, что находится во входных данных, которые не являются прямым хэшем, если у вас есть такой объект:

 {a: "da", b: {c:"test", e: {f: "bird"}}, d:"duck", g: 1, h: [{i: "hola"}, {j: "chao"}]}
 

Результатом было бы:

 "datestbirdduck1{:i=>"hola"}{:j=>"chao"}"
 

Комментарии:

1. Большое спасибо! Мне нравится это решение. Однако я продолжаю получать ошибку в консоли Rails, в которой говорится, что уровень стека по какой-то причине слишком высок. Вы когда — нибудь видели это?

2. Да, возможно, это потому, что он не находит способа выйти из петли. Используете ли вы точно те же данные, которые вы добавили в свой вопрос?

3. @KortneyStinson вы получаете такую ошибку, когда слишком много рекурсивных вызовов. Возможно, ваш хэш вложен очень глубоко. Также может быть цикл внутри хэша, например, что-то вроде h = {}; h[:a] = h

4. @Себастьян, я использовал точно такой же ввод. Он случайно остановился после того, как я перезагрузил консоль rails. Хммм, теперь это работает идеально! Большое вам спасибо!

5. @Стефан да, я думаю, что это могло быть проблемой, но я перезагрузил консоль, и она начала работать идеально. Я собираюсь попробовать это с большим хэшем, который я на самом деле буду использовать