Как перебрать хэш в Ruby - PullRequest
0 голосов
/ 02 июля 2011

Я имею дело с xml следующим образом:

<fare_master_pricer_reply>  
 <flight_index>

  <group_of_flights>
    <flight_details>
    </flight_details>
    .
    .
    <flight_details>
    </flight_details>   
   </group_of_flights>

  <group_of_flights>
    <flight_details>
    </flight_details>
    .
    .
    <flight_details>
    </flight_details>   
   </group_of_flights>
     .    
     .   
   <group_of_flights>
    <flight_details>
    </flight_details>
    .
    .
    <flight_details>
    </flight_details>   
   </group_of_flights>  
  </flight_index> 
 </fare_master_pricer_reply>

Это дано мне в хеш-объекте.Мне нужно перебрать этот хеш, и пока я закодировал это:

@flights = response.to_hash[:fare_master_pricer_calendar_reply][:flight_index]
while (@flight_groups = @flights[:group_of_flights]) != nil
  while (@flight = @flight_groups[:flight_details])
    @time_data = @flight[:flight_information][:product_date_time]
    @html = "<tr>"
    @html += "<td>" + @time_data[:date_of_departure] + "</td>"
    @html += "<td>" + @time_data[:date_of_arrival] + "</td>"
    @html += "<td>" + @flight[:location][:location_id] + "</td>"
    @html += "</tr>"
  end
  @html = "<tr><td>**</td><td>**</td><td>**</td><td>**</td><td>**</td><td>**</td><td>**</td></td>"
end

, но я получаю

TypeError (Символ как индекс массива):

в этой строке:

while (@flight = @flight_groups[:flight_details])

Почему мой хэш становится массивом?Это правильный способ перебрать мой оригинальный хеш?

Спасибо !!!

Ответы [ 2 ]

10 голосов
/ 02 июля 2011

Правильный способ итерации по хешу выглядит так:

@flights.each do |key, value|
end

См. Хэш # каждый

3 голосов
/ 02 июля 2011

Посмотрите на ваш XML:

<fare_master_pricer_reply>  
 <flight_index>
  <group_of_flights>
   <!--...-->
  </group_of_flights>
  <group_of_flights>
   <!--...-->
  </group_of_flights>
  <group_of_flights>
   <!--...-->
  </group_of_flights>
  <!--...-->

Итак, <flight_index> содержит список <group_of_flights> элементов. Естественно, это будет представлено как массив, а не хеш.

Затем вы делаете это:

@flights = response.to_hash[:fare_master_pricer_calendar_reply][:flight_index]

И это эквивалентно этому:

h = response.to_hash
@flights = [:fare_master_pricer_calendar_reply][:flight_index]

Итак, @flights заканчивается содержимым <flight_index>. Как отмечалось выше, <flight_index> - это просто контейнер для списка элементов <group_of_flights>, и ваш XML-менеджер, вероятно, преобразует этот список в наиболее естественное представление списка, что даст вам экземпляр Array, а не Hash.

Вы не хотите перебирать @flights как хэш, вместо этого перебирайте его как массив. Вероятно, вы столкнетесь с такой же ситуацией с внутренними элементами <flight_details>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...