2013-06-17 2 views
0
와 해시 및 배열을 병합

내가 좋아하는 달의 배열이있는 경우 :레일은 서로 다른 키

["05", "06", "07", "08", "09", "10", "11", "12", "01", "02", "03", "04", "05"] 

그리고 한 달 값의 해시와 month_sum : 내가 병합 어떻게

[{"month"=>5, "month_sum"=>20}, {"month"=>4, "month_sum"=>100}] 

을 배열에 해시 그래서 뭔가를 얻을?

date_from = Date.parse(params[:search][:date_from]) 
date_to = Date.parse(params[:search][:date_to]) 
date_range = date_from..date_to 

date_months = date_range.map {|d| Date.new(d.year, d.month, 1) }.uniq 
@date_range = date_months.map {|d| d.strftime "%m" } 

그래서주의가 범위를 초과하는 경우, 2 년 기간을 말하는 것으로, 배열이있을 것입니다 : 달의 배열이 생성됩니다

[{"05" => 20}, {"07" => 0}, {"08" => 0}, {"09" => 0}, {"10" => 0}, {"11" => 0}, {"12" => 0}, {"01" => 0}, {"02" => 0}, {"03" => 0}, {"04" => 100}, {"05" => 0}, {"06" => 0}] 

편집 월 - 값 중복. 그 배열에 해를 추가해야 할 것 같아요?

더 좋은 방법이 있나요?

최종 목표는 특정 차량에 대한 연료 사용량의 월간 액수를 표시하는 하이 차트 용 해시 또는 배열을 얻는 것입니다. (그냥 컨텍스트가 있음).

+2

, 프로그램. 그렇게하는 마법 방법은 없습니다. 너 뭐 해봤 니? – meagar

+0

질문이 명확하지 않습니다. 1. 첫 번째 {{ "05"...}에게 두 번째가 아닌 ""20 "이 있어야한다고 말하는 규칙은 무엇입니까? 2. 어떤 규칙에 의해'{ "06"...} "이 예상 출력에 삽입됩니까? 체계적인 규칙이 여기에 있습니까, 아니면 그냥 당신의 sloppiness입니까? – sawa

+0

또한 "06"을 두 번째 요소에서 마지막 요소로 임의로 이동했습니다. – meagar

답변

3

시도해보십시오. 최종 제품은 해시 배열이 아니라 해시입니다. 그러나 해시가이 경우에 더 쉽게 작업 할 수 있다고 생각합니다. 루프가 (새로운 정보에 비추어)

# starting variables 
array_of_months = ["05", "06", "07", "08", "09", "10", "11", "12", "01", "02", "03", "04", "05"] 
month_sums = [{"month"=>5, "month_sum"=>20}, {"month"=>4, "month_sum"=>100}] 

# clean up array_of_months 
months = array_of_months.compact.sort 
=> ["01", "02", "03", "04", "05", "05", "06", "07", "08", "09", "10", "11", "12"] 

# compress month_sums into single key/value pairs such that first value becomes the key and second value becomes the value 
sums = month_sums.inject({}) { |a, ms| a.merge!("%02d" % ms['month'] => ms['month_sum']) } 
=> { "05" => 20, "04" => 100 } 

# generate hash of all months and match sums value if key is present otherwise assign value zero 
all_month_sums = months.inject({}) { |h, m| h.merge!(m => sums[m] || 0) } 
=> {"01"=>0, "02"=>0, "03"=>0, "04"=>100, "05"=>20, "06"=>0, "07"=>0, "08"=>0, "09"=>0, "10"=>0, "11"=>0, "12"=>0} 

EDIT

# starting variables 
months = ["05", "06", "07", "08", "09", "10", "11", "12", "01", "02", "03", "04", "05"] 
month_sums = [{"month"=>5, "month_sum"=>20}, {"month"=>4, "month_sum"=>100}, {"month" => 5, "month_sum" => 99 }] 

# iterate each month, select the first match, remove the match when done. if no match just give month a zero. 
months.inject([]) do |a, month| 
    if s = month_sums.select { |s| month.to_i == s['month'] }.first 
    a << { "%02d" % s['month'] => s['month_sum'] } 
    s['month'] = nil 
    else 
    a << { month => 0 } 
    end 
    a 
end 
=> [{"05"=>20}, {"06"=>0}, {"07"=>0}, {"08"=>0}, {"09"=>0}, {"10"=>0}, {"11"=>0}, {"12"=>0}, {"01"=>0}, {"02"=>0}, {"03"=>0}, {"04"=>100}, {"05"=>99}] 
+0

좋은 결과입니다. 편집 할 때마다 편집하여 편집 할 수 있습니까? –

+0

수정 사항을 보았습니다. 예, 중복 된 달이 있으면 문제가 될 수 있습니다. 또한 최종 제품은 키가 고유해야하므로 배열이 될 수 없습니다. 이것에 대해 생각해 봐야 겠어. –

+0

아마도 나는 날짜 배열을 'm-yyyy'로 만들 필요가 있을까? –