2015-12-08 104 views
1

我从API解析JSON。我有一个foo元素,它有时是散列,而其他时候是散列数组。作为数组的第一个元素的红宝石哈希

foo: { ... } 

foo: [ 
    { ... }, 
    { ... } 
] 

我想只使用Array(foo)总是得到一个数组与至少一个元素,但它哈希转换为[[..., ...], [..., ...]]。除了使用foo.is_a?(Hash/Array)之外,有没有一种优雅的方式可以解决这个问题?

+1

考虑到您没有Rails标记,为什么要加载一些与“ActiveSupport”一样大的内容来执行简单计算?没有比@Veet这样简单的方法。即使缺少Rails标签是一种疏忽,现在也不能很好地添加它。 –

+0

@CarySwoveland正确。这是宝石,只有红宝石。谢谢! – Dudo

回答

3

添加到@ 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 
+1

您应该使用'flatten(1)'来避免拼合嵌套数组。 – Stefan

+0

@斯特凡,你说得对。编辑。 –

+1

是的,但问题没有Rails标签,所以纯Ruby解决方案的解决方案是很重要的。 –

3

在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'

+0

gem install activesupport;需要有效支持 – yez

2

如果你想使用纯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)建议立即进行删除工作。

+0

你不需要'push',只需要:'[{a:1}]。flatten' /'[[{a:1},{b:2}]] flatten' – Stefan

+0

感谢Stefan的输入。上面的答案应该足够Dudo所要求的,即使没有使用积极的支持。即他将foo元素作为散列或散列数组获取,并且他想将其转换为散列数组或散列数组。 – Veets

+0

我只想指出''] .push(obj)'相当于'[obj]' – Stefan