处理哈希数组或单个哈希(来自API响应)

时间:2015-08-19 17:37:13

标签: ruby api

我有一个响应的API:

  1. 哈希数组

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

    results = {a:1, b:2}
    
  3. nil

  4. 我正在尝试以一种优雅的方式来处理这种情况,这样我就可以在它存在的地方添加一个额外的参数。

    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
    

    但它看起来很难看,弄乱了它周围的代码(而且我有一个我无法确定的错误)......

    有更优雅的方法吗?

4 个答案:

答案 0 :(得分:1)

希望这对你有用。

 # 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

上面的代码也可以写成如下:

5.times do
  p  [call_api].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}]

答案 1 :(得分:0)

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

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

这会清理你的代码,而不是使它成为一堆嵌套的ifs。

答案 2 :(得分:0)

你想要

  

&#34;在它出现的地方添加一个额外的参数。&#34;

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

  

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

     

results = {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

答案 3 :(得分:0)

规范化对数组的API响应(即使它有0或1个哈希)也可以帮助你:

results = [results].flatten.compact