결 측값으로 해시 배열 채우기
Nov 25 2020
ApexChart에 대한 히트 맵 특정 차트를 작성 하려고 합니다. 지금까지 3 가지 활동에 대한 해시 배열을 얻었습니다.
[{
:name => "Activity 1",
:data => {
"May 2020" => 37, "June 2020" => 17, "July 2020" => 9, "August 2020" => 18
}
}, {
:name => "Activity 2",
:data => {
"May 2020" => 3
}
}, {
:name => "Activity 3",
:data => {
"July 2020" => 5, "November 2020" => 11
}
}]
활동 3에, 우리는 단지 2 개월 가지고, July
하고 November
.
내 필요는 각 해시, 모든 누락 된 날짜를 채우고 값으로 0으로 채우는 것입니다. 내가 기다려온 결과는
[{
:name => "Activity 1",
:data => {
"May 2020" => 37, "June 2020" => 17, "July 2020" => 9, "August 2020" => 18, "November 2020" => 0
}
}, {
:name => "Activity 2",
:data => {
"May 2020" => 3, "June 2020" => 0, "July 2020" => 0, "August 2020" => 0, "November 2020" => 0
}
}, {
:name => "Activity 3",
:data => {
"May 2020" => , "June 2020" => 0, "July 2020" => 5, "August 2020" => 0, "November 2020" => 11
}
}]
예, September
일부러 누락되었습니다. 이를 달성하는 가장 좋은 방법은 매월 하나씩 검색하는 것입니다. 그런 다음 누락 된 달로 각 배열을 채 웁니다. 그러나 나는 이것을 달성하는 방법을 모릅니다.
답변
1 CarySwoveland Nov 26 2020 at 02:57
arr
해시 배열 인 경우 두 단계로 원하는 배열을 구성 할 수 있습니다.
require 'date'
date_fmt = "%B %Y"
first_month, last_month = arr.flat_map do |g|
g[:data].keys
end.map { |s| Date.strptime(s, date_fmt) }.minmax
#=> [#<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)>,
# #<Date: 2020-11-01 ((2459155j,0s,0n),+0s,2299161j)>]
h = (first_month..last_month).map do |d|
d.strftime(date_fmt)
end.product([0]).to_h
#=> {"May 2020"=>0, "June 2020"=>0, "July 2020"=>0, "August 2020"=>0,
# "September 2020"=>0, "October 2020"=>0, "November 2020"=>0}
arr.map { |g| g.merge(:data => h.merge(g[:data])) }
#=> [
# {
# :name=>"Activity 1",
# :data=>{
# "May 2020"=>37, "June 2020"=>17, "July 2020"=>9,
# "August 2020"=>18, "September 2020"=>0,
# "October 2020"=>0, "November 2020"=>0
# }
# },
# {
# :name=>"Activity 2",
# :data=>{
# "May 2020"=>3, "June 2020"=>0, "July 2020"=>0,
# "August 2020"=>0, "September 2020"=>0,
# "October 2020"=>0, "November 2020"=>0
# }
# },
# {
# :name=>"Activity 3",
# :data=>{
# "May 2020"=>0, "June 2020"=>0, "July 2020"=>5,
# "August 2020"=>0, "September 2020"=>0,
# "October 2020"=>0, "November 2020"=>11
# }
# }
# ]
참조 Enumerable에서 #의 flat_map , 날짜 : strptime , 배열 번호의 MINMAX , 날짜 번호의의 strftime , 배열 번호 제품 및 해시 # 병합을 . 날짜 형식 지정 지시문 은 DateTime # strptime 을 참조하십시오 .
first_month
및 의 계산에서 last_month
,
[#<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)>,
#<Date: 2020-11-01 ((2459155j,0s,0n),+0s,2299161j)>].
map { |d| d.strftime(date_fmt) }
#=> ["May 2020", "November 2020"]
1 KARASZIIstván Nov 25 2020 at 18:27
먼저 달을 가져온 다음 귀하의 경우에 해시 인 배열 항목을 수정하여 비슷한 것을 얻을 수 있습니다.
months = data.flat_map { |d| d[:data].keys }.to_set
data.each do |d|
months.each do |month|
d[:data][month] = 0 unless d[:data].key?(month)
end
end
또한 할 수 Array
있는 것은 Hash
값이 기본값으로 초기화 되는 새 파일을 만드는 것입니다 .
data_with_default = data.map do |d|
{
name: d[:name],
data: Hash.new(0).update(d[:data])
}
end
BenTrewern Nov 25 2020 at 18:48
다음을 시도하십시오.
a = [{
:name => "Activity 1",
:data => {
"May 2020" => 37, "June 2020" => 17, "July 2020" => 9, "August 2020" => 18
}
}, {
:name => "Activity 2",
:data => {
"May 2020" => 3
}
}, {
:name => "Activity 3",
:data => {
"July 2020" => 5, "November 2020" => 11
}
}]
months = ['May 2020', 'June 2020', 'July 2020', 'August 2020', 'November 2020']
puts a.map { |h| { name: h[:name], data: Hash[months.map { |m| [m, h[:data][m] ? h[:data][m] : 0] }] } }