使用Ruby和Count次数搜索JSON响应

时间:2018-09-27 00:10:01

标签: ruby-on-rails arrays json api hash

我今天似乎无法解决以下问题。我正在解析API的JSON响应,该信息可帮助我计划我的物品将装满多少盒才能完成装运。

我已经保存了API的JSON响应并将其解析到下面的Rails中名为API_response的变量中。现在,我特别需要计算此响应中每次"id"=>"Bin1"出现的时间。

我在想,也许最好的方法是对"id"=>"Bin1"进行选择并将其每次映射到一个数组,然后计算该数组中的索引数,以便最终得到算我要用多少盒?我将如何去做?

API_response = {"response"=>{"id"=>"1538005707_bc789275d7cc93eca86830e41a44f7a9", "bins_packed"=>[{"bin_data"=>{"w"=>12, "h"=>6, "d"=>12, "id"=>"Bin1", "used_space"=>57.8704, "weight"=>80, "used_weight"=>100, "stack_height"=>5, "order_id"=>"unknown"}, "items"=>[{"id"=>12, "w"=>10, "h"=>5, "d"=>10, "wg"=>80}]}, {"bin_data"=>{"w"=>12, "h"=>6, "d"=>12, "id"=>"Bin1", "used_space"=>57.8704, "weight"=>80, "used_weight"=>100, "stack_height"=>5, "order_id"=>"unknown"}, "items"=>[{"id"=>12, "w"=>10, "h"=>5, "d"=>10, "wg"=>80}]}, {"bin_data"=>{"w"=>12, "h"=>6, "d"=>12, "id"=>"Bin1", "used_space"=>57.8704, "weight"=>80, "used_weight"=>100, "stack_height"=>5, "order_id"=>"unknown"}, "items"=>[{"id"=>12, "w"=>10, "h"=>5, "d"=>10, "wg"=>80}]}], "errors"=>[], "status"=>1, "not_packed_items"=>[]}}

更新 我认为我真正真正喜欢做的是,对于Bin1的每次出现,都将bin的权重推到一个新的数组中。因此,我希望以上响应示例的最终结果是一个数组,例如Bin1_Array = [80, 80, 80]

3 个答案:

答案 0 :(得分:2)

假设您只需要数字3作为示例,

API_response["response"]["bins_packed"].count do |item| 
  item["bin_data"]["id"] == "Bin1"
end

编辑注释中的其他问题

API_response["response"]["bins_packed"].each_with_object([]) do |item, arr|
  arr << item["bin_data"]["weight"] if item["bin_data"]["id"] == "Bin1"
end

答案 1 :(得分:1)

这与Marcin Kolodziej的答案相同,只是要注意,如果将rxHistogram(~tip_percent|tip_per,data=my_xdf, transforms= list(tip_per=factor(cut(tip_percent,breaks=c(0,5,10,15,20,25,35))),labels=c('Up 5','>5-10','>10-15','>15-20','>20-25','>25')))标记在API_response的末尾,就像这样:

with_indifferent_access

然后,您可以使用符号代替字符串作为键(我倾向于使用),如下所示:

API_response = {
  "response"=>{
    ...
  }
}.with_indifferent_access

如果您不喜欢所有这些方括号(我倾向于这样做,因为它会减慢我的打字速度),您可以这样做:

API_response[:response][:bins_packed].count do |item|
  item[:bin_data][:id] == "Bin1"
end

如果由于某种原因,您可能缺少:response或:bins_packed的键(在这种情况下,API_response.dig(:response, :bins_packed).count do |item| item.dig(:bin_data, :id) == "Bin1" end 将返回dig,而nil将抛出错误),则可以做

.count

如果键丢失,哪个将返回(API_response.dig(:response, :bins_packed) || []).count do |item| item.dig(:bin_data, :id) == "Bin1" end 。这似乎不太可能,但是我想我还是会提到它。

答案 2 :(得分:0)

您可以尝试以下方法:

API_response["response"]["bins_packed"].group_by{|x| x["bin_data"]["id"]}["Bin1"].count

在这里group_by将对[“ bin_data”] [“ id”]的元素进行分组,一旦我们进行分组,就可以轻松获取特定键的分组计数。