Ruby hash dig или вернуть ноль, если это невозможно - PullRequest
0 голосов
/ 30 октября 2018

Мне нужно получить доступ к массиву, который находится достаточно глубоко в объекте JSON, чтобы затем отобразить содержимое массива и вернуть новый массив.

Если массив существует -> содержимое сопоставленного массива

Если массив пуст ... ИЛИ массив не существует -> [] (пустой массив)

Я пытался сделать раскопки и карту ...

the_data.dig('foo', 'bar', 0, 'baz', 'fuzz').map ...

fuzz - это мой массив, который я хочу отобразить.

Но часть, которая выходит из строя, это часть после bar, потому что здесь это пустой массив.

Как я могу безопасно вернуться сюда?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы можете использовать оператор безопасной навигации &. (представлен в Ruby 2.3).

some_variable&.some_method
# is equivalent to
some_variable.nil? ? nil : some_variable.some_method
# or
some_variable.some_method unless some_variable.nil?

Поскольку оба Array # dig и Hash # dig возвращают nil, если какой-либо промежуточный шаг равен nil, это должно удовлетворить ваши требования. Пропуск вызова map , если полученное значение равно nil.

the_data
  .dig('foo', 'bar', 0, 'baz', 'fuzz')
  &.map ...

Другой вариант - сохранить данные в переменной и использовать оператор , если .

if fuzz = the_data.dig('foo', 'bar', 0, 'baz', 'fuzz')
  fuzz.map ...
end

Или, если вы работаете в методе и не можете продолжить работу без значения, вы можете добавить защиту, которая возвращает метод, если значение отсутствует.

##
# Does something.
# 
# @param the_data [Hash] a JSON object that ...
# @return [Array<Object>, nil] an array containing ... 
#   or nil if the JSON object doesn't has the correct structure 
def some_method(the_data)
  fuzz = the_data.dig('foo', 'bar', 0, 'baz', 'fuzz') or return
  fuzz.map ...
end
0 голосов
/ 30 октября 2018

Я бы просто пошел на

the_data.dig('foo', 'bar', 0, 'baz', 'fuzz').to_a.map

как

nil.to_a == []

Вы попытаетесь отобразить пустой массив, который просто ничего не будет делать и снова вернет пустой массив.

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