2017-12-29 5 views
0

해시가 있으며 키 순서를 변경하고 싶습니다.Ruby 해시 키의 순서 변경

{"result"=>{"data"=>[{"Quantity"=>13, "Rate"=>17.1}, 
        {"Quantity"=>29,"Rate"=>3.2}, 
        {"Quantity"=>7, "Rate"=>3.4}]}} 

는받는 사람 :

{"result"=>{"data"=>[{"Rate"=>17.1, "Quantity"=>13}, 
        {"Rate"=>3.2, "Quantity"=>29}, 
        {"Rate"=>3.4, "Quantity"=>7}]}} 

hash["result"]["data"]에 액세스 할 수 있습니다. 나는 노력했다.

hash["result"]["data"][0].each_value{|v| v.replace({"Rate" => v.delete("Rate")}.merge(v))} 

그러나 오류 제공합니다

NoMethodError (undefined method `delete' for 17.1:Float):

+2

왜 키의 순서를 변경하고 싶어를? 너 왜 신경 쓰냐? 달성하려는 것은 무엇입니까? – spickermann

답변

2

이 시도,

hash["result"]["data"].each{|v| v.replace({"Rate" => v.delete("Rate")}.merge(v))} 
2

나는 작업이 많은 일을 할 필요가 없다 생각합니다. 난 data 귀하의 전체 해시 다음 단지 하나의지도 및 해시의 역방향 문제를 해결할 것입니다 포함되어 있다고 가정합니다.

data['result']['data'] = data['result']['data'].map{|v| Hash[v.to_a.reverse]} 
1

네 더 많은 방법 ...

는 그 해시 항목의 순서 역

:

hash['result']['data'].each { |h| h["Quantity"] = h.delete("Quantity") } 

첫 번째 이동 : 끝까지

hash['result']['data'].map! { |h| h.to_a.reverse.to_h } 

이동 "수량" 종료일 :

hash['result']['data'].map! { |h| h.merge([h.shift].to_h) } 

특정 주어진 위해 강제 :

keys = ["Rate", "Quantity"] 
hash['result']['data'].map! { |h| keys.zip(h.values_at(*keys)).to_h }