Ruby 处理散列数组或单个散列(来自API响应)

Ruby 处理散列数组或单个散列(来自API响应),ruby,api,Ruby,Api,我有一个API,其响应为: 散列数组 results = [{a: 1, b: 2}, {a:2, b:3}] 如果只有一个结果,则为单个哈希 results = {a:1, b:2} 或nil 我正试图找到一种优雅的方法来处理这种情况,这样我就可以在出现的地方添加一个额外的参数 e、 g。 情景1: results.map!{|h| h.update(c:3) } 情景2: results[:c] = 3 情景3: (Don't do anything) 我试过了 if resu

我有一个API,其响应为:

  • 散列数组

    results = [{a: 1, b: 2}, {a:2, b:3}]
    
  • 如果只有一个结果,则为单个哈希

    results = {a:1, b:2}
    
  • nil

  • 我正试图找到一种优雅的方法来处理这种情况,这样我就可以在出现的地方添加一个额外的参数

    e、 g。 情景1:

    results.map!{|h| h.update(c:3) }
    
    情景2:

    results[:c] = 3
    
    情景3:

    (Don't do anything)
    
    我试过了

    if results.is_a?(Array)
      results.map!{|h| h.update(c:3) }
    elsif results.is_a?(Hash)
      results.update(c:3)
    end
    
    但是它看起来很难看,把周围的代码弄乱了(我有一个我无法确定的bug)


    有没有更优雅的方法可以做到这一点?

    在Ruby中,您可以使用
    case
    来测试类型

    def type? item    
        case result
           when Array
               "array"
           when Hash
               "hash"
           else
               "couldn't figure it out"
        end
    end
    

    这将清理您的代码,而不是使其成为一堆嵌套的if。

    希望这对您有用

     # API Simulator
     def call_api
        # Lets return randomly - one of the three results
        [ [{a: 1, b: 2}, {a:2, b:3}], {a: 1, b:2}, nil ].sample
     end
    
     5.times do 
        r = []
        r << call_api
        p r.flatten.compact.map { |h| h.update(c:3) }
     end
    
    输出将始终是数组,它可能是空的,或者如果它包含哈希,则在每个哈希中都有
    {:c=>3}
    。其中一个示例运行产生以下输出:

    []
    [{:a=>1, :b=>2, :c=>3}]
    []
    [{:a=>1, :b=>2, :c=>3}, {:a=>2, :b=>3, :c=>3}]
    [{:a=>1, :b=>2, :c=>3}]
    
    你想

    “在存在的位置添加一个额外参数。”

    因此,当我们成功地添加一个额外的参数时,它将不再是单一的,正如文档所说:

    如果只有一个结果,则为单个哈希

    results = {a:1, b:2}
    
    结果={a:1,b:2}

    如果结果不是
    nil
    ,我们不需要太多思考就可以这样做:

    array.new(results).flatten.append(c:3)
    
    因此,一个可能的解决方案是:

    newhash={c:3}
    if result.nil? ? array.new(results).flatten.append(c:3) else newhash end
    

    但我觉得这不是最好的解决方案:p将API响应规范化为数组(即使它有0或1个散列)将帮助您:

    results = [results].flatten.compact
    

    这是一个糟糕的api。他们可能不关心用户,我认为这是API设计的失败。第二种情况应该是
    [{a:1,b:2}]
    ,第三种情况应该是
    []
    。不幸的是,它不是我的api…现在替换
    ([]