Ruby Выбор массива - вложенные карты с подстановочными знаками - PullRequest
0 голосов
/ 14 января 2020

Я получил ответ JSON, и я хотел бы извлечь значения для данного ключа по нескольким индексам.

json_object['resources'].select {|a| a["type"] == "aws_subnet" && a["name"] == "private"}.first["instances"]

Это дает мне массив экземпляров. Каждый экземпляр содержит элемент карты атрибутов, который затем содержит элемент ID. Все, что я пытаюсь сделать, это получить массив всех идентификаторов. Делать следующее:

json_object['resources'].select {|a| a["type"] == "aws_subnet" && a["name"] == "private"}.first["instances"][0..3]["attributes"]["id"]

Получает меня страшно:

TypeError (no implicit conversion of String into Integer)

1 Ответ

0 голосов
/ 14 января 2020

Глядя на то, как вы структурировали утверждение, проблема заключается в выборе диапазона - [0..3]

Выбор диапазона вернет array, а не hash.

При попытке извлечь ["attributes"] из array возникает ошибка TypeError, поскольку массивы индексируются Integer с, а не String с.

, чтобы исправить это, я рекомендую использовать map функция для перебора всех экземпляров с получением значения id каждого:

json_object['resources'].select {|a| a["type"] == "aws_subnet" && a["name"] == "private"}.first["instances"][0..3].map { |inst| inst["attributes"]["id"] }

Кроме того, если вы хотите оптимизировать, я бы рекомендовал использовать find вместо select с последующим first. find ищет первый матч, который выполняет то же самое, но с лучшей производительностью.

С этим вот что вы ищете:

ids = json_object['resources'].find {|a| a["type"] == "aws_subnet" && a["name"] == "private"}["instances"][0..3].map { |inst| inst["attributes"]["id"] }

Примечание: Согласно комментарию Тана, в будущем было бы полезно включить пример ответа JSON, который вы пытаетесь проанализировать, чтобы мы могли убедиться, что ответ работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...