我從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