2017-12-05 4 views
1

해시 또는 해시 배열 인 객체 (API와에서 반환 됨)가 있습니다. 이미 배열이 아니면 배열로 묶고 싶습니다.배열 메소드 대 해시

Array(1) # => [1] 
Array([1, 2]) # => [1, 2] 
Array([{a: 1}, {b: 2}]) # => [{:a=>1}, {:b=>2}] 

을하지만 해시 실패 :

Array({a: 1}) # => [[:a, 1]] 

[{:a=>1}]을해야

나는 숫자 나 배열과 예상되는 방식으로 작동하는, 그것을 Array을 적용했습니다.

responses = [responses] if responses.is_a?(Hash) 

더 나은 솔루션이 있습니까 :

또한, 나는 유형 검사를 추가 할 수 있을까?

+5

'[responses] .flatten'입니다. – mudasobwa

+1

또한'ActiveSupport'는 당신이 원하는 것을 정확하게 수행하는 ['Array # wrap'] (http://api.rubyonrails.org/classes/Array.html#method-c-wrap)을 소개합니다. – mudasobwa

+0

@mudasobwa Perfect,'Array # wrap'이 제 선택입니다. – sschmeck

답변

2

ActiveSupport 당신이 원하는 것을 정확히 않습니다 Array#wrap을 소개합니다 어쨌든 나는 여러 가지 이유로 Rails 도우미를 사용하지 않으므로 [responses].flatten 또는 가장 명확한 버전은

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

내가 배열로 묶어야 할 배열이 아닌 경우. try_convert 사용 또는

result = [result] unless result.is_a? Array 

, :

무엇에 대한

Array.wrap(responses) 

개인적으로 현 :

result = Array.try_convert(result) || [result]