2016-08-06 2 views
-4

Если у меня есть хэш, как показано ниже, и я хочу перебрать ключи второго уровня.Как петля внутри хэша?

Почему это не удается?

hash["Element"].each do |id| 
    h[id] = hash[id]["Name"] 
end 

хэш

{ 
    "Element" => { 
     "499723" => { 
         "Name" => "A", 
     }, 
     "499725" => { 
         "Name" => "B", 
    }, 
} 
+0

Вы получаете вниз голоса на ваш вопрос, потому что это можно было высчитать по чтению [документация] (HTTP: // рубиново-доку. org/core-2.3.1/Hash.html # method-i-each) для «каждого» Хэша. «[Насколько ожидаются усилия по исследованию пользователей Stack Overflow?] (Http://meta.stackoverflow.com/q/261592/128421)« поможет объяснить, почему. –

ответ

2

Это терпит неудачу, потому что с помощью .each на Hash дает кортеж ключа и значения.

hash = { 
    "Element" => { 
    "499723" => { 
     "Name" => "A", 
    }, 
    "499725" => { 
     "Name" => "B", 
    }, 
    } 
} 

hash["Element"].each do |id| 
    p id 
end 

["499723", {"Name"=>"A"}] 
["499725", {"Name"=>"B"}] 

Таким образом, вы должны использовать

hash["Element"].each do |id, value| 
    # ... 
end 

Если значение не требуется

hash["Element"].each do |id, _| 
    # ... 
end 

Однако, вы можете сохранить значение и получить доступ к нему непосредственно

hash["Element"].each do |id, value| 
    h[id] = value["Name"] 
end 

Простым решением в вашем случае является использовать Enumberable#each_with_object в сочетании с предыдущей информацией:

hash["Element"].each_with_object({}) do |(id, value), acc| 
    acc[id] = value["Name"] 
end 

# => {"499723"=>"A", "499725"=>"B"} 
+0

Когда я хочу использовать последний пример, который вы дали по сравнению со вторым последним, что требует меньше ввода? –

+1

В исходном примере вы использовали накопитель 'h' для хранения возвращаемого значения. Вы не включили его в свой вопрос. Последняя версия, которую я предложил, не требует дополнительной переменной в качестве аккумулятора. Количество «ввода» не всегда является показателем хорошего кода. –

+0

Очень приятно! Благодарю. –

1
hash["Element"].each.with_object({}) do |(id, subhash), result| 
    result[id] = subhash["Name"] 
end 
Смежные вопросы