Arrays 数组方法与散列
我有一个对象(从和API返回),它要么是散列,要么是散列数组。如果它还不是数组,我想把它括在数组中 我尝试在其上应用Arrays 数组方法与散列,arrays,ruby,activesupport,Arrays,Ruby,Activesupport,我有一个对象(从和API返回),它要么是散列,要么是散列数组。如果它还不是数组,我想把它括在数组中 我尝试在其上应用Array,它以预期的方式使用数字或数组: Array(1) # => [1] Array([1, 2]) # => [1, 2] Array([{a: 1}, {b: 2}]) # => [{:a=>1}, {:b=>2}] 但它无法使用哈希: Array({a: 1}) # => [[:a, 1]] 应该是[{:a=>1}] 或者,我可以
Array
,它以预期的方式使用数字或数组:
Array(1) # => [1]
Array([1, 2]) # => [1, 2]
Array([{a: 1}, {b: 2}]) # => [{:a=>1}, {:b=>2}]
但它无法使用哈希:
Array({a: 1}) # => [[:a, 1]]
应该是[{:a=>1}]
或者,我可以添加一个类型检查:
responses = [responses] if responses.is_a?(Hash)
有更好的解决方案吗?正如@mudasobwa所建议的,
[responses]。扁平化可能是最干净的解决方案:
[{a: 1}].flatten #=> [{:a=>1}]
[[{a: 1}, {b: 2}]].flatten #=> [{:a=>1}, {:b=>2}]
显然,这种不一致的响应格式不是一个很好的API设计;但不幸的是,这是与外部资源合作的本质
如果上面数组中的每个散列确实表示一个唯一的对象,那么我将保留该代码。但是,如果您实际上对单个实体的每个属性都有不同的散列(?),那么您可以进一步清理API响应,如下所示:
[{a: 1}].flatten.reduce(:merge) #=> {:a=>1}
[[{a: 1}, {b: 2}]].flatten.reduce(:merge) #=> {:a=>1, :b=>2}
正如@mudasobwa所建议的,[responses].flatte
可能是最干净的解决方案:
[{a: 1}].flatten #=> [{:a=>1}]
[[{a: 1}, {b: 2}]].flatten #=> [{:a=>1}, {:b=>2}]
显然,这种不一致的响应格式不是一个很好的API设计;但不幸的是,这是与外部资源合作的本质
如果上面数组中的每个散列确实表示一个唯一的对象,那么我将保留该代码。但是,如果您实际上对单个实体的每个属性都有不同的散列(?),那么您可以进一步清理API响应,如下所示:
[{a: 1}].flatten.reduce(:merge) #=> {:a=>1}
[[{a: 1}, {b: 2}]].flatten.reduce(:merge) #=> {:a=>1, :b=>2}
如果它还不是数组,我想把它括在数组中
那么:
result = [result] unless result.is_a? Array
或者,使用:
如果它还不是数组,我想把它括在数组中
那么:
result = [result] unless result.is_a? Array
或者,使用:
ActiveSupport
介绍了一种完全满足您需要的功能:
Array.wrap(responses)
出于许多原因,我个人不喜欢使用任何Rails帮助程序,因此我会坚持使用[responses].flatte
,或者更好的是,使用最明确的版本:
case responses
when Hash then [responses]
when Array then responses
else raise "shit happened"
end
ActiveSupport
介绍了一种完全满足您需要的功能:
Array.wrap(responses)
出于许多原因,我个人不喜欢使用任何Rails帮助程序,因此我会坚持使用[responses].flatte
,或者更好的是,使用最明确的版本:
case responses
when Hash then [responses]
when Array then responses
else raise "shit happened"
end
[responses].flatten
。另外ActiveSupport
引入了完全符合您需要的功能。@mudasobwa完美,数组#wrap
是我的选择。“哈希或哈希数组”–有机会修复API吗?[responses].flatte
。同时ActiveSupport
引入了您想要的功能。@mudasobwa完美,Array#wrap
是我的选择。“哈希或哈希数组”-有机会修复API吗?