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





Предполагая, что вам просто нужен номер 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
Ах! Большое вам спасибо, Марчин. Я бился головой о стену, пытаясь придумать лучший способ. Сделать это в таком блоке невероятно просто. Ваше здоровье!
О, на самом деле Марчин, помимо подсчета количества вхождений, я также хотел бы, возможно, сделать следующее: для каждого вхождения 'Bin1' я хотел бы подтолкнуть вес каждого Bin1 (в данном случае все они "weight"=>80) в новый массив. Итак, используя ответ выше, я хотел бы получить такой результат: Bin1= [80, 80, 80]
Удивительный @Marcin! Я думаю, что теперь у меня гораздо более четкое представление о том, как выбрать то, что мне нужно из этих ответов JSON, когда вы показали мне, как это сделать с помощью вашего редактирования. Еще раз спасибо, вы палка-выручалочка.
Это тот же ответ, что и Марцин Колодзей, только с примечанием, что если вы пометите 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 в случае отсутствия ключей. Это кажется маловероятным, но я подумал, что все равно упомяну об этом.
Это тоже здорово! Не так страшно, что это вызовет ошибку, поскольку у меня есть обработка ошибок при вызове, но спасибо за то, что показал мне, как справиться с этой ситуацией, если это не так!
Вы можете попробовать это:
API_response["response"]["bins_packed"].group_by{|x| x["bin_data"]["id"]}["Bin1"].count
Здесь group_by сгруппирует элементы ["bin_data"] ["id"], как только мы сгруппируем, мы сможем получить, мы можем легко получить количество групп определенного ключа.
Вам нужно, сколько раз встречается
Bin1, или сумма размеров массиваitems, когда идентификатор равенBin1?