Ruby哈希挖掘或如果不可能返回nil

时间:2018-10-30 15:46:30

标签: arrays ruby

我必须访问一个深入到JSON对象中的数组,然后映射该数组的内容并返回新数组。

如果数组存在->映射的数组内容

如果数组为空...或者数组不存在-> [](空数组)

我已经尝试过进行挖掘和映射...

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

fuzz是我要映射的数组。

但是失败的部分是bar之后的部分,因为这里是空数组。

我如何安全地回到这里?

2 个答案:

答案 0 :(得分:4)

我只是去

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

nil.to_a == []

您将尝试映射一个空数组,这将完全不执行任何操作,然后再次返回一个空数组。

答案 1 :(得分:3)

您可以使用safe navigation operator &.(在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#digHash#dig均返回nil,如果中间步骤为nil,则这应满足您的要求。如果结果值为nil,则跳过 map 调用。

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

另一种选择是将数据保存在变量中,并使用 if 语句。

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