2017-12-05 13 views
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) 

は、よりよい解決策はありますか?

+5

'[回答] .flatten':多くの理由のために任意のRailsのヘルパーを使用することはありませんので、私はほとんどの明示的なバージョンで、より良い、[responses].flattenに固執、またはでしょうえー。 – mudasobwa

+1

また、 'ActiveSupport'はあなたが望むものを正確に実行する[' Array#wrap'](http://api.rubyonrails.org/classes/Array.html#method-c-wrap)を導入しています。 – mudasobwa

+0

@mudasobwaパーフェクト、 'Array#wrap'は私の選択です。 – sschmeck

答えて

2

ActiveSupportは正確に何をしたいんArray#wrapが導入されています

Array.wrap(responses) 

私は個人的に県

case responses 
when Hash then [responses] 
when Array then responses 
else raise "shit happened" 
end 
2

@mudasobwaが示唆したように、[responses].flattenは、おそらく最もクリーンなソリューションです:

[{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} 
1

私は配列でそれを囲みたいですそれがまだ配列でない場合

何について:また

result = [result] unless result.is_a? Array 

try_convertを使用して:

result = Array.try_convert(result) || [result] 
関連する問題