Несмотря на то, что это кажется распространенной проблемой, я просто потратил некоторое время, пытаясь найти / придумать именно то, что мне нужно, что, я думаю, соответствует вашим требованиям. Ни одна из ссылок в первом ответе не является точечной.
class Hash
def deep_find(key)
key?(key) ? self[key] : self.values.inject(nil) {|memo, v| memo ||= v.deep_find(key) if v.respond_to?(:deep_find) }
end
end
Так дано:
hash = {:get_transaction_list_response => { :get_transaction_list_return => { :transaction => [ { ...
Следующее:
hash.deep_find(:transaction)
найдет массив, связанный с: ключом транзакции.
Это неоптимально, поскольку ввод будет продолжать повторяться, даже если заполнено memo .