循环哈希(数组)

时间:2013-03-10 16:26:52

标签: ruby-on-rails ruby

我有这个问题,我继续

TypeError: can't convert String into Integer

这是我要浏览这个@data对象的地方。

这是@data对象

@data = HTTParty.get("")

{
"body"=>{
    "predictions"=>{
        "direction"=>{
            "prediction"=>[
                {
                    "epochTime"=>"1362931090892",
                },
                {
                    "epochTime"=>"1362931747892",

                },
                {
                    "epochTime"=>"1362932467892",

                },
                {
                    "epochTime"=>"1362933187892",

                },
                {
                    "epochTime"=>"1362933847892",

                }
            ],
            "title"=>"xxxx"
        },
        "a"=>"xx",
        "b"=>"x"
    },
    "name"=>"some"
}

}

我上面的代码已经

  <%  if @data["body"]["predictions"].present? %>
  <% @data["body"]["predictions"].each do |p| %>
        <%p["direction"].each do |d|%>
            <% d["prediction"].each do |k|%>
              <h4><%= k["epchoTime.."] %> </h4>
            <%end%>
        <%end%>
      <%end%>
<%end%>

我不知道如何解决这个问题,我认为这是因为我应该像使用名称[整数]值一样访问C ++中的内容,但我想使用[“name”]。如何让我的代码工作?

感谢您宝贵的时间和考虑。

4 个答案:

答案 0 :(得分:1)

以下是使用Nokogiri解析原始XML的示例:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<body>
  <predictions>
    <direction>
      <prediction>
        <epochTime>1362931090892</epochTime>
        <epochTime>1362931747892</epochTime>
        <epochTime>1362932467892</epochTime>
        <epochTime>1362933187892</epochTime>
        <epochTime>1362933847892</epochTime>
      </prediction>
      <title">xxxx</title>
      <a>"xx"</a>
      <b>"x"</b>
      <name>"some"</name>
    </direction>
  </predictions>
</body>
EOT

epoch_times = doc.search('epochTime').map(&:text)

返回epochTime值数组:

[
    [0] "1362931090892",
    [1] "1362931747892",
    [2] "1362932467892",
    [3] "1362933187892",
    [4] "1362933847892"
]

有时我们需要遍历包含prediction块的所有epochTime块。这样就可以了:

epoch_times = doc.search('prediction').map{ |predict|
  predict.search('epochTime').map(&:text)
}

[
    [0] [
        [0] "1362931090892",
        [1] "1362931747892",
        [2] "1362932467892",
        [3] "1362933187892",
        [4] "1362933847892"
    ]
]

有时你需要找到一个特定的节点并抓住其中某种类型的所有元素:

doc = Nokogiri::XML(<<EOT)
<body>
  <predictions>
    <direction>
      <prediction id="1">
        <epochTime>1362931090892</epochTime>
        <epochTime>1362931747892</epochTime>
        <epochTime>1362932467892</epochTime>
        <epochTime>1362933187892</epochTime>
        <epochTime>1362933847892</epochTime>
      </prediction>
      <title">xxxx</title>
      <a>"xx"</a>
      <b>"x"</b>
      <name>"some"</name>
    </direction>
  </predictions>
</body>
EOT

epoch_times = doc.search('prediction[id="1"]').map{ |predict| predict.search('epochTime').map(&:text) }

[
    [0] [
        [0] "1362931090892",
        [1] "1362931747892",
        [2] "1362932467892",
        [3] "1362933187892",
        [4] "1362933847892"
    ]
]

答案 1 :(得分:0)

Tin Man有一个很好的观点,即将这种逻辑置于观点之外,应该是一个模型的作品。这是一个更清晰的观点。

<% @data['body']['predictions']['direction']['prediction'].each do |x| %>
  <% x.each do |k, v| %>
    <h4><%= v %></h4>
  <% end %>
<% end %>

答案 2 :(得分:0)

您似乎忽略了没有嵌套值的密钥,例如titleab

        "title"=>"xxxx"
    },
    "a"=>"xx",
    "b"=>"x"
},

您的最终代码应该是

if @data["body"]["predictions"].present? 
 @data["body"]["predictions"].each do |p|
  p.each do |d|
   if d.kind_of? Hash
    d.each do |k| 
     if k.kind_of? Array
      k.each do |x|
        if x.kind_of? Array
          x.each do |y|
            if y.kind_of? Hash
              puts y["epochTime"]
            end
          end
        end
      end 
    end
    end
   end
  end
 end
end

上面的代码很丑,但你是C ++程序员,你可能会喜欢它:P

答案 3 :(得分:0)

整个哈希事情已经失控,因为我经常检测每个人的存在并循环通过它,所以正如锡人所说,我使用XML'nokogiri'然后使用.css方法来检测它是否存在和循环通过它,因为原始响应是在xml中。

  @doc.css('predictions').each do |predictions_node| 
        predictions_node.css('direction').each do |direction_node| 
          direction_node.css('prediction').each do |prediction|
            // stuff here 

感谢您的时间和考虑。