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]]}
나머지 계산은 비슷합니다.
철저한 설명 주셔서 감사합니다. 그것에게 시도를 줄 것이다 – Mac
이것은 내가 그것을 시험해 보았을 때 내가 생각해 내었던 정확하게 것이다. – Santhosh
감사합니다. @cary swoveland. 이것 역시 효과가있었습니다. – Mac