2015-07-17 2 views
-1

У меня возникли проблемы с итерацией через ряд вложенных хэшей, и я думаю, что это потому, что внутренние хэши называются строками. К сожалению, я не могу просто изменить эти имена. Вот общий хэш рода, что я работаю с:Итерация через вложенные хэши с именами с использованием строк

hash = 
    "name" => { 
    "stuff" => "value", 
    "key" => "value", }, 

    "name" => {   
    "stuff" => "value", 
    "key" => "value", }, 

Я пытаюсь написать программу, которая будет печатать поля помечены как «имя», а значения, в пределах, при вызове имена их ключей. Прямо сейчас, я застрял с

hash.each do |key, value| 
    puts key 
    key.each do |stuff, info| 
    puts info if category == "stuff" 
    end 
end 

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

+0

вы можете дать мне пример вывода? –

+0

Измените, чтобы сделать 'hash' действительным объектом Ruby (т. Е.' Hash = {...} '). Обратите внимание, что ключи хеша должны быть уникальными. Вы можете иметь hash = {"name1" => {"stuff" => "value"}, "name2" => {"stuff" => "value"}} ', но не' hash = {"name" => {"stuff" => "value"}, "name" => {"stuff" => "value"}} ', потому что' 'name" появляется дважды в качестве ключа. –

+1

* Значение * - это вложенный хэш, а не ключ. Вам нужно '.each' по * значению *. Вам также нужно понять, что именовать ваши аргументы блока так же, как строки в хеше ничего не делают. Имена переменных не имеют значения. – meagar

ответ

0

Как говорит @meager - суб-хэш находится в значении. Попробуйте

hash.each do |key, sub_hash| 
    puts key 
    sub_hash.each do |category, info| 
    puts info if category == "stuff" 
    end 
end 
+0

Отлично, большое вам спасибо, это очень помогает. Один последующий вопрос, который у меня есть, - это то, что происходит, если вся структура данных вложена внутри метода? Как мне следует обращаться к нему для повторения, так как каждый метод не работает для имен методов? – stackquestions

+0

Если метод возвращает вложенный хеш (или есть перечислимый объект), то каждый будет действовать на возвращенный хеш. Поэтому method_name.each работает до тех пор, пока имя метода возвращает перечислимый объект. – ReggieB

0

Что у вас есть массив хэшей, а не Hash:

arr = [ 
     {"name" => {"stuff" => "value","key" => "value" }}, 
     {"name" => {"stuff" => "value","key" => "value" }}, 
     {"noname" => {}} 
    ] 

arr.each do |hash| 
    name = hash["name"] 
    puts name["stuff"] if name 
end 
Смежные вопросы