2015-12-08 158 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