代码之家  ›  专栏  ›  技术社区  ›  Fogmeister

Ruby hash dig或返回nil(如果不可能)

  •  2
  • Fogmeister  · 技术社区  · 7 年前

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

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

    我试过挖掘地图。。。

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

    fuzz 是我要映射的数组。

    但失败的部分是后一部分 bar

    2 回复  |  直到 7 年前
        1
  •  4
  •   Marcin Kołodziej    7 年前

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

    作为

    nil.to_a == []
    

    您将尝试映射一个空数组,它将不执行任何操作并再次返回一个空数组。

        2
  •  3
  •   3limin4t0r    7 年前

    safe navigation operator &. (在Ruby2.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 如果中间步骤 如果结果值为 .

    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