代码之家  ›  专栏  ›  技术社区  ›  Shalafister's

Rails,如何循环哈希数组或仅循环哈希

  •  0
  • Shalafister's  · 技术社区  · 6 年前

    我连接到一个API,得到一个哈希数组,或者数据只有一个哈希。所以当数据以哈希数组的形式出现时;

    "extras"=>{"extra"=>[{"id"=>"529216700000100800", "name"=>"Transfer Trogir - Dubrovnik (8 persons max)", "price"=>"290.0", "currency"=>"EUR", "timeunit"=>"0", "customquantity"=>"0", "validdatefrom"=>"1970-01-01", "validdateto"=>"2119-07-20", "sailingdatefrom"=>"1970-01-01", "sailingdateto"=>"2119-07-20", "obligatory"=>"0", "perperson"=>"0", "includedinbaseprice"=>"0", "payableoninvoice"=>"1", "availableinbase"=>"-1", "includesdepositwaiver"=>"0", "includedoptions"=>""}, {"id"=>"528978430000100800", "name"=>"Gennaker + extra deposit (HR)", "price"=>"150.0", "currency"=>"EUR", "timeunit"=>"604800000", "customquantity"=>"0", "validdatefrom"=>"1970-01-01", "validdateto"=>"2119-07-19", "sailingdatefrom"=>"1970-01-01", "sailingdateto"=>"2119-07-19", "obligatory"=>"0", "perperson"=>"0", "includedinbaseprice"=>"0", "payableoninvoice"=>"1", "availableinbase"=>"-1", "includesdepositwaiver"=>"0", "includedoptions"=>""}]
    

    I'am遍历数组以获得如下值:;

    b["extras"]["extra"].each do |extra|
      puts extra["id"]
      puts extra["name"]
    end
    

    但当这不是数组时;只有1个哈希,那么这就不起作用了,添加每个循环使其成为数组,而不是哈希数组;

    "extras"=>{"extra"=>{"id"=>"640079840000100800", "name"=>"Comfort package (GRE)", "price"=>"235.0", "currency"=>"EUR", "timeunit"=>"0", "customquantity"=>"0", "validdatefrom"=>"1970-01-01", "validdateto"=>"2120-03-25", "sailingdatefrom"=>"2015-01-01", "sailingdateto"=>"2120-03-25", "obligatory"=>"1", "perperson"=>"0", "includedinbaseprice"=>"0", "payableoninvoice"=>"1", "availableinbase"=>"-1", "includesdepositwaiver"=>"0", "includedoptions"=>""}}
    
    
    b["extras"]["extra"].each do |extra|
      puts extra["id"]
      puts extra["name"]
    end
    

    这一次,它给出了error-TypeError(没有将字符串隐式转换为整数);

    当我键入puts时 extra.inspect ; 我明白了 ["id", "640079840000100800"] . 所以要想成功我应该通过 extra[1] 获取id号。

    但我无法预测哈希数组或仅预测哈希。有什么简单的方法可以解决这个问题,既可以使用哈希数组,也可以只使用哈希?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Aleksei Matiushkin    6 年前

    简单的解决方案:可以预先检查对象类型:

    case b["extras"]["extra"]
    when Array
        # handle array
    when Hash
        # handle hash
    end
    

    正确的解决方案:无论发生什么,都要生成一个哈希数组。

    [*[input]].flatten
    

    并将其处理为具有至少一个哈希元素的数组(使用 each .)

    如果您对使用Rails助手没有过敏,请参阅下面@Stefan的宝贵评论。

        2
  •  2
  •   Aleksei Matiushkin    6 年前

    你可以尝试使用 Object#kind_of? 确定是否为 Array 或a Hash 例子

    if b["extras"]["extra"].kind_of? Array
        # handle array
    elsif b["extras"]["extra"].kind_of? Hash
        # handle hash
    end