DB 호출의 해시가 하나 이상 (1000 일 수도 있음) 있습니다. 이 경우 두 가지가 있습니다.모든 배열이 함께 압축 된 키 배열의 해시 합치기
{ "water_need"=>[9959, 9959, 9959, 9959, 9959, 9959, 9959, 9959, 9959, 9959, 9959, 9959], "forecast_savings"=>[-2479, -2479, -2479, -2479, -2479, -2479, -2479, -2479, -2479, -2479, -2479, -2479], "water_actual"=>[7480, 7480, 7480, 7480, 7480, 7480, 7480, 7480, 7480, 7480, 7480, 7480] }
{ "water_need"=>[21090, 21090, 21090, 21090, 21090, 21090, 21090, 21090, 21090, 21090, 21090, 21090], "forecast_savings"=>[-20890, -20890, -20890, -20890, -20890, -20890, -20890, -20890, -20890, -20890, -20890, -20890], "water_actual"=>[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200] }
각 해시는 동일한 키를 가지고 있습니다. 각 해시는 키 값과 동일한 길이 배열을가집니다. 어떤 배열에는 nil
이있을 수 있습니다. 모든 값이 nil
이면 배열은 여전히 모두 nil
의 12 길이 배열입니다.
목표는 해시와 배열이 동일한 값을 가진 동일한 키를 가진 단일 해시를 반환하는 것입니다. 예상 결과 :
def add_arrays(first, *others)
first.zip(*others).map { |column| column.reduce(&:+) }
end
내 생각은 모든 'water_needs'
예를 들어, 다음에 세트를 먹이를 보유하고 몇 가지 새로운 변수로 비슷한 키를 매핑하는 것입니다
{ "water_need"=>[31049, 31049, 31049, 31049, 31049, 31049, 31049, 31049, 31049, 31049, 31049, ], "forecast_savings"=>[-23369, -23369, -23369, -23369, -23369, -23369, -23369, -23369, -23369, -23369, -23369, -23369], "water_actual"=>[7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680, 7680] }
나는 배열을 추가하려면이 방법을 발견 추가 된 값을 반환하는 add_arrays
메서드 나는 이것을하기위한 올바른 방법에 대한 지침을 얻기 위해 여기에왔다.
업데이트 :
나는 오후에이 작업을했습니다. 여기 내 솔루션은 지금까지이지만 제대로 NILS를 처리하지 않습니다
@month = []
@water_need = []
@cost_need = []
@forecast_savings = []
@forecast_cost_savings = []
# @etc_padding = []
@water_actual = []
@reduction_amount = []
@benchmark.each_with_index do |record, index|
@water_need[index] = record['water_need']
@cost_need[index] = record['cost_need']
@forecast_savings[index] = record['forecast_savings']
@forecast_cost_savings[index] = record['forecast_cost_savings']
# @etc_padding[index] = record['etc_padding']
@water_actual[index] = record['water_actual']
@reduction_amount[index] = record['reduction_amount']
end
@water_need_total = @water_need.transpose.map(&:sum)
@cost_need_total = @cost_need.transpose.map(&:sum)
@forecast_savings_total = @forecast_savings.transpose.map(&:sum)
@forecast_cost_savings_total = @forecast_cost_savings.transpose.map(&:sum)
# @etc_padding_total = @etc_padding.transpose.map(&:sum)
@water_actual_total = @water_actual.transpose.map(&:sum)
@reduction_amount_total = @reduction_amount.transpose.map(&:sum)
@cumulative_baseline = { month: month_array,
water_need: @water_need_total,
cost_need: @cost_need_total,
forecast_savings: @forecast_savings_total,
forecast_cost_savings: @forecast_cost_savings_total,
# etc_padding: @etc_padding_total,
water_actual: @water_actual_total,
reduction_amount: @reduction_amount_total
}
ap @cumulative_baseline
'AP 통신'입니다 궁금해 경우 누구의 최고 출력 (콘솔 형식에 대한 보석).
코드가 완성되지 않았습니다. 코드 작성 스타일이 먼 길을 먼저 쓰는 경향이 있습니다. 모든 것이 내 머리 속에서 분명 해졌고, 추상화를 찾아 내고 다시 꺼내 들었습니다. 이것은 코드의 현재 상태입니다. 최종 형식임을 나타내지는 않습니다.
@benchmark는 모든 해시가 포함 된 개체입니다. 그것은 일련의 레코드 (ActiveRecord 호출에 공통적 인)이고 레코드는 필자가 작성한 것처럼 키가있는 해시이며 (예 : water_need) 해당 키의 값은 해당 배열입니다.
이 예에서는 단일 배열의 모든 값이 동일 함을 의미합니다. 그렇다면 데이터에 냄새가 있습니다. 그들은 과다하다. 그렇지 않은 경우, 귀하의 예는 오해의 소지가 있고 부적절합니다. – sawa
배열 당 12 개의 요소를 나타내는 요소는 해당 연도에 12 개월을 나타냅니다. 때로는 숫자가 같거나 때로는 그렇지 않습니다. 그것들이 같거나 같지 않은 것은 동일한 '유형'의 다중 배열을 합하는 작업에 아무런 영향을 미치지 않습니다. – notaceo