Як зробити цикл по хешу хешів?


81

У мене є цей хеш:

 h
 => {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}} 

>  h.each do |key, value|
>     puts key
>   puts value
>   end
67676.mpa
linkpool/sdafdsaffsize4556

Як отримати доступ до окремих значень у хеші значень у циклі?


1
Що ви хотіли б бачити як результат?
Марк Томас

використаний шингара appcoach спрацював чудово .... я повинен намалювати пробіл ... відповідь була прямо переді мною ... мені довелося зробити внутрішню петлю
Matt Elhotiby

добре відомо, що результат путів на хеш досить марний, чи не пробували ви "ставить хеш.інспект"?
Tokland

Відповіді:


161

Значення - це хеш, тому вам потрібно повторити його, або ви можете отримати лише значення: -

h.each do |key, value|
  puts key
  value.each do |k,v|
    puts k
    puts v
  end
end

або

h.each do |key, value|
  puts key
  value.values.each do |v|
    puts v
  end
end


тут що, якщо ключ ніде не використовується? . нам потрібно поставити ?замість ключа? приклад: чи |?, array|є дійсним синтаксис для Ruby?
huzefa biyawarwala

@huzefabiyawarwala, якщо ключ не використовується в ітерації, вам слід додати до нього підкреслення таким чином|_key, value|
Severin

17

Ви захочете зробити рекурсію через хеш, ось рекурсивний метод:

def ihash(h)
  h.each_pair do |k,v|
    if v.is_a?(Hash)
      puts "key: #{k} recursing..."
      ihash(v)
    else
      # MODIFY HERE! Look for what you want to find in the hash here
      puts "key: #{k} value: #{v}"
    end
  end
end

Потім ви можете взяти будь-який хеш і передати його:

h = {
    "x" => "a",
    "y" => {
        "y1" => {
            "y2" => "final"
        },
        "yy1" => "hello"
    }
}
ihash(h)

тут що, якщо ключ ніде не використовується? . нам потрібно поставити ?замість ключа? приклад: чи |?, array|є дійсним синтаксис?
huzefa biyawarwala

Зберігайте, просто не використовуйте. знак питання недійсний.
Тревіс Рідер,


5

Найпростіший спосіб відокремити всі три значення в цьому випадку буде таким:

h.each do |key, value|
  puts key
  puts value[:link]
  puts value[:size]
end

2

Ви можете отримати доступ до значень хешу безпосередньо за допомогою виклику hash.values. У цьому випадку ви можете зробити щось подібне

> h = {"67676.mpa"=>{:link=>"pool/sdafdsaff", :size=>4556}}
> h.values.each do |key, value|
>   puts "#{key} #{value}"
> end

link pool/sdafsaff
size 4556
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.