Ruby 处理散列数组或单个散列(来自API响应)
我有一个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
results = [{a: 1, b: 2}, {a:2, b:3}]
results = {a:1, b:2}
nil
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…现在替换([]