我有一个响应的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
但它看起来很难看,弄乱了它周围的代码(而且我有一个我无法确定的错误)......
有更优雅的方法吗?
答案 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