我从API解析JSON。我有一个foo
元素,它有时是散列,而其他时候是散列数组。作为数组的第一个元素的红宝石哈希
foo: { ... }
foo: [
{ ... },
{ ... }
]
我想只使用Array(foo)
总是得到一个数组与至少一个元素,但它哈希转换为[[..., ...], [..., ...]]
。除了使用foo.is_a?(Hash/Array)
之外,有没有一种优雅的方式可以解决这个问题?
我从API解析JSON。我有一个foo
元素,它有时是散列,而其他时候是散列数组。作为数组的第一个元素的红宝石哈希
foo: { ... }
foo: [
{ ... },
{ ... }
]
我想只使用Array(foo)
总是得到一个数组与至少一个元素,但它哈希转换为[[..., ...], [..., ...]]
。除了使用foo.is_a?(Hash/Array)
之外,有没有一种优雅的方式可以解决这个问题?
添加到@ yez回答,如果你不使用activesupport
,你可以扩展Array
有一个wrap
功能:
def Array.wrap(object)
if object.nil?
[]
elsif object.respond_to?(:to_ary)
object.to_ary || [object]
else
[object]
end
end
从http://apidock.com/rails/Array/wrap/class
来实现它的另一种粗暴的方式复制是:
def Array.wrap(object)
return [] if object.nil?
[object].flatten(1)
end
您应该使用'flatten(1)'来避免拼合嵌套数组。 – Stefan
@斯特凡,你说得对。编辑。 –
是的,但问题没有Rails标签,所以纯Ruby解决方案的解决方案是很重要的。 –
在Rails环境,以获得activesupport
:
你可以使用Array.wrap
foo = { a: :b }
=> {:a=>:b}
Array.wrap(foo)
=> [{:a=>:b}]
Array.wrap([1,2,3])
=> [1, 2, 3]
没有Rails中,你可以做gem install activesupport
,然后在你的代码:require 'activesupport'
gem install activesupport;需要有效支持 – yez
如果你想使用纯Ruby的,那么你可以按项目(S)来解决这个问题(任阵散列或散列)为空数组,然后弄平阵列等下列:
2.0.0-p247 :001 > [{a:1}].flatten(1)
=> [{:a=>1}]
2.0.0-p247 :002 > [[{a:1},{b:2}]].flatten(1)
=> [{:a=>1}, {:b=>2}]
即[foo].flatten(1)
建议立即进行删除工作。
考虑到您没有Rails标记,为什么要加载一些与“ActiveSupport”一样大的内容来执行简单计算?没有比@Veet这样简单的方法。即使缺少Rails标签是一种疏忽,现在也不能很好地添加它。 –
@CarySwoveland正确。这是宝石,只有红宝石。谢谢! – Dudo