Поиск ответа JSON с использованием значений Ruby и Count - PullRequest
0 голосов
/ 27 сентября 2018

Сегодня я не могу обернуться вокруг следующей проблемы.Я анализирую ответ JSON от API, который помогает мне планировать, сколько ящиков будут заполнены для отправки.

Я сохранил и проанализировал ответ JSON от API в переменную с именем API_response в Rails ниже.Теперь мне нужно подсчитывать каждый раз, когда в этом ответе появляется "id"=>"Bin1".

Я думаю, что, возможно, лучший способ сделать это - выбрать select для "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 выдвигать вес корзины в новый массив.Поэтому я хотел бы, чтобы мой конечный результат из приведенного выше примера ответа был массивом, например Bin1_Array = [80, 80, 80]

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Это тот же ответ, что и у Марцина Колодзея, только с примечанием, что если вы пометите with_indifferent_access в конце вашего API_response, например так:

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

Тогда вы можете использовать символы вместо строк, какВаши ключи (которые я предпочитаю) примерно так:

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

Если вам не нравятся все эти скобки (что мне не нравится, потому что это замедляет мой набор текста), вы можете сделать:

API_response.dig(:response, :bins_packed).count do |item|
  item.dig(:bin_data, :id) == "Bin1"
end

Если по какой-то причине у вас могут отсутствовать ключи для: response или: bins_packed (в этом случае dig вернет nil, а .count выдаст ошибку), вы можете сделать

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

Который вернет 0 в случае отсутствия ключей.Это кажется маловероятным, но я все равно упомянул об этом.

0 голосов
/ 27 сентября 2018

Вы можете попробовать это:

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

Здесь group_by сгруппирует элементы ["bin_data"] ["id"], как только мы сгруппируемся, мы сможем получить, что мы можем легко получить счетчик группыконкретного ключа.

0 голосов
/ 27 сентября 2018

Предполагая, что вам просто нужен номер 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...