我必须访问一个深入到JSON对象中的数组,然后映射该数组的内容并返回新数组。
如果数组存在->映射的数组内容
如果数组为空...或者数组不存在-> [](空数组)
我已经尝试过进行挖掘和映射...
the_data.dig('foo', 'bar', 0, 'baz', 'fuzz').map ...
fuzz
是我要映射的数组。
但是失败的部分是bar
之后的部分,因为这里是空数组。
我如何安全地回到这里?
答案 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#dig和Hash#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