Поиск ответа JSON с помощью Ruby и Count Occurance

Сегодня я не могу осмыслить следующую проблему. Я анализирую ответ 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]

Вам нужно, сколько раз встречается Bin1, или сумма размеров массива items, когда идентификатор равен Bin1?

Marcin Kołodziej 27.09.2018 02:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
356
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Предполагая, что вам просто нужен номер 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

Ах! Большое вам спасибо, Марчин. Я бился головой о стену, пытаясь придумать лучший способ. Сделать это в таком блоке невероятно просто. Ваше здоровье!

Tanner Brandt 27.09.2018 02:27

О, на самом деле Марчин, помимо подсчета количества вхождений, я также хотел бы, возможно, сделать следующее: для каждого вхождения 'Bin1' я хотел бы подтолкнуть вес каждого Bin1 (в данном случае все они "weight"=>80) в новый массив. Итак, используя ответ выше, я хотел бы получить такой результат: Bin1= [80, 80, 80]

Tanner Brandt 27.09.2018 03:16

Удивительный @Marcin! Я думаю, что теперь у меня гораздо более четкое представление о том, как выбрать то, что мне нужно из этих ответов JSON, когда вы показали мне, как это сделать с помощью вашего редактирования. Еще раз спасибо, вы палка-выручалочка.

Tanner Brandt 27.09.2018 03:29

Это тот же ответ, что и Марцин Колодзей, только с примечанием, что если вы пометите 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 в случае отсутствия ключей. Это кажется маловероятным, но я подумал, что все равно упомяну об этом.

Это тоже здорово! Не так страшно, что это вызовет ошибку, поскольку у меня есть обработка ошибок при вызове, но спасибо за то, что показал мне, как справиться с этой ситуацией, если это не так!

Tanner Brandt 27.09.2018 03:32

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

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

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

Другие вопросы по теме