Rails遍历深深的哈希数组

时间:2014-07-04 17:56:25

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我将这个非常混乱的哈希数组作为API响应。

http://jsfiddle.net/PP9N5/

(完整的回复是巨大的。只发布一部分,但它涵盖了响应的所有元素) 我怎样才能到达“航空公司”。

我试过这个

<% @flight["air_search_result"]["onward_solutions"]["solution"].each do|h| %>
  <strong><%=h["pricing_summary"]["total_fare"] %></strong> - 
  <% h["flights"]["flight"]["segments"]["segment"].each do |s| %>
    <%= s['airline'] %>
  <% end %> <br> <hr>
<% end %>

我收到此错误

  

无法将String转换为整数

我做了一些修改,比如

<%= h["flights"]["flight"]["segments"]["segment"].first["airline"] %>
Error received - can't convert String into Integer

<%= h["flights"]["flight"]["segments"]["segment"][0]["airline"] %>
Error received - undefined method '[]' for nil:NilClass

不是有一个简单的方法,就像我说找到一个关键的“航空公司”,并为该键返回它的价值。我偶然发现了this link,虽然我没有收到任何错误,但我也没有得到任何结果。

感谢。

更新

我做了这个

<% h["flights"]["flight"]["segments"]["segment"].each do |o,p| %>
<% if o=="airline" %> <%= p %> <% end %>
 <% end %> <br> <hr>
<% end %>

我可以得到很少的航空公司价值,其中内部分段没有数组 例如,我可以得到departure_date_time是2014-07-07T07:10:00,index = 5。

http://jsfiddle.net/PP9N5/1/(向下滚动)

2 个答案:

答案 0 :(得分:2)

以下是您可以添加的一些代码,这些代码将提取与Hash中任意Hash中的参数相等的所有密钥:

class Hash
  def deep_find(query, &block)
    flat_map do |key, value|
      if key == query
        yield value if block_given?
        [value]
      elsif value.is_a? Hash
        value.deep_find(query, &block)
      elsif value.is_a? Array
        value.select { |i| i.is_a? Hash }.flat_map { |h| h.deep_find(query, &block) }
      end
    end
  end
end

示例:

hash = {"h" => [{ 'x' => [1, 5] }, { 'x' => 2 }, { 'f' => { 'x' => [3, 4] } }], 'x' => 6 }
hash.deep_find('x') { |x| puts "#{x}" }
# [1, 5]
# 2
# [3, 4]
# 6
# => [[1, 5], 2, [3, 4], 6]

答案 1 :(得分:1)

这是一个典型的问题:D

替换&#34; =&gt;&#34; for&#34;:&#34;并呈现。

your_json = {.....}
your_json.gsub("=>", ":")
puts your_json

您可以在使用http://jsonlint.com/之前验证JSON。