Arrays 数组方法与散列

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}] 或者,我可以

我有一个对象(从和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}]

或者,我可以添加一个类型检查:

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吗?