2016-12-27 2 views
2

이 루비 해시 구조를 해시 배열로 변환하고 싶습니다.해시 배열을 해시 배열로 변경

data = 
    { 
     ["Transportations", "Not-Approved"] => 350, 
     ["Transportations", "Approved"]  => 160, 
     ["Communications", "Not-Approved"] => 300, 
     ["Communications","Approved"]  => 80, 
     ["Rentals","Not-Approved"]   => 50, 
     ["Rentals", "Approved"]    => 145, 
     ["Salaries","Not-Approved"]   => 150, 
     ["Salaries", "Approved"]   => 310 
    } 

하려면 : 최종 구조는 감사에서 사전

에서 차트 API를 사용됩니다,

data = [ 
    { 
     name: "Transportations", 
     data: [["Not-Approved", 350], ["Approved", 160]] 
    }, 
    { 
     name: "Communications", 
     data: [["Not-Approved", 300], ["Approved", 80]] 
    }, 
    { 
     name: "Rentals", 
     data: [["Not-Approved", 50], ["Approved", 145]] 
    }, 
    { 
     name: "Salaries", 
     data: [["Not-Approved", 150], ["Approved", 310]] 
    } 
] 

답변

4

C ODE

def rearrange(data) 
    data.group_by { |k,_| k.first }.map { |name, arr| 
    { name: name, data: arr.map { |(_,outcome), val| [outcome, val] } } } 
end 

data = { 
    ["Transportations", "Not-Approved"] => 350, 
    ["Transportations", "Approved"]  => 160, 
    ["Communications", "Not-Approved"] => 300, 
    ["Communications","Approved"]  => 80, 
    ["Rentals","Not-Approved"]   => 50, 
    ["Rentals", "Approved"]    => 145, 
    ["Salaries","Not-Approved"]   => 150, 
    ["Salaries", "Approved"]   => 310 
} 

rearrange(data) 
    #=> [{:name=>"Transportations", 
    #  :data=>[["Not-Approved", 350], ["Approved", 160]]}, 
    # {:name=>"Communications", 
    #  :data=>[["Not-Approved", 300], ["Approved", 80]]}, 
    # {:name=>"Rentals", 
    #  :data=>[["Not-Approved", 50], ["Approved", 145]]}, 
    # {:name=>"Salaries", 
    #  :data=>[["Not-Approved", 150], ["Approved", 310]]} 
    # ] 

설명

다음의 첫 번째 단계이다.

h = data.group_by { |k,_| k.first } 
    #=> { "Transportations"=>[ 
    #  [["Transportations", "Not-Approved"], 350], 
    #  [["Transportations", "Approved"], 160] 
    #  ], 
    #  "Communications"=>[ 
    #  [["Communications", "Not-Approved"], 300], 
    #  [["Communications", "Approved"], 80] 
    #  ], 
    #  "Rentals"=>[ 
    #  [["Rentals", "Not-Approved"], 50], 
    #  [["Rentals", "Approved"], 145] 
    #  ], 
    #  "Salaries"=>[ 
    #  [["Salaries", "Not-Approved"], 150], 
    #  [["Salaries", "Approved"], 310] 
    #  ] 
    # } 

Enumerable#group_by의 두번째 블록 변수는 키의 값 (키는 제 블록 변수 임) 유지한다. 예를 들어 키가 ["Transportations", "Not-Approved"] 인 경우 값은 350입니다. 나는 블럭 변수 _ (유효한 지역 변수)을 값에 할당했다. 주로 블럭 계산에 사용되지 않는다는 것을 독자에게 알리기 위해서였다.

먼저 enum의 첫 번째 요소를 생성하고, 블록에 전달

enum = h.map 
    #=> #<Enumerator: 
    #  {"Transportations"=>[ 
    #  [["Transportations", "Not-Approved"], 350], 
    #  [["Transportations", "Approved"], 160] 
    #  ], "Communications"=>[ 
    # ... 
    #   [["Salaries", "Approved"], 310]]}:map> 

정의 번째 단계 h의 키 - 값 쌍의 사상을 이해하고, 블록 변수 값을 할당 병렬 할당을 사용합니다.

name, arr = enum.next 
    #=> ["Transportations", [ 
    #  [["Transportations", "Not-Approved"], 350], 
    #  [["Transportations", "Approved"], 160] 
    # ] 
    # ] 
name 
    #=> "Transportations" 
arr 
    #=> [ 
    # [["Transportations", "Not-Approved"], 350], 
    # [["Transportations", "Approved"], 160] 
    # ] 

map '블록 계산이 수행됩니다. 첫째, 계산

a = arr.map { |(_,outcome), val| [outcome, val] } 
    #=> [["Not-Approved", 350], ["Approved", 160]] 

다음 "교통"해시를 구성하십시오.

{ name: name, data: a } 
    #=> {:name=>"Transportations", 
    # :data=>[["Not-Approved", 350], ["Approved", 160]]} 

나머지 계산은 비슷합니다.

+0

철저한 설명 주셔서 감사합니다. 그것에게 시도를 줄 것이다 – Mac

+1

이것은 내가 그것을 시험해 보았을 때 내가 생각해 내었던 정확하게 것이다. – Santhosh

+0

감사합니다. @cary swoveland. 이것 역시 효과가있었습니다. – Mac

2

이 시도

h = Hash.new { |h, k| h[k] = { name: k, data: {} }} 
data.each { |(name, each), value| h[name][:data][each] = value }; 
h.values.each { |each| each[:data] = each[:data].to_a } 
array = h.values 
+0

감사합니다. – Mac