我今天似乎无法解决以下问题。我正在解析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]
答案 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”]的元素进行分组,一旦我们进行分组,就可以轻松获取特定键的分组计数。