如何在这两个散列数组之间执行加法,例如,我想从第一个数组中获取第一个哈希和和number, s_number, l_number,从第二个数组获取第一个散列,和将取决于created_at,如果第一个数组中的created_at与第二个数组中的created_at相等,则执行+。请看一看我希望得到的回报,因为我不知道如何更好地解释这一点。
谢谢
raw_data = [
[
{"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
{"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
{"created_at"=>"2013-11-19","number"=>1,"s_number"=>1,"l_number"=>1},
{"created_at"=>"2013-11-20","number"=>0,"s_number"=>0,"l_number"=>0}
],
[
{"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
{"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1},
{"created_at"=>"2013-11-19","number"=>5,"s_number"=>45,"l_number"=>7},
{"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}
]
]应该归还什么?
[
{"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
{"created_at"=>"2013-11-18","number"=>7,"s_number"=>42,"l_number"=>5},
{"created_at"=>"2013-11-19","number"=>6,"s_number"=>46"l_number"=>8},
{"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}
]更新散列格式与我发布的内容不同:
{:created_at=>Sun, 17 Nov 2013, :number=>0, :s_number=>0, :l_number=>0}发布于 2013-11-20 11:31:30
首先,您需要对数组进行求和:
raw_data.sum这将归还如下的东西:
[
{"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
{"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
{"created_at"=>"2013-11-19","number"=>1,"s_number"=>1,"l_number"=>1},
{"created_at"=>"2013-11-20","number"=>0,"s_number"=>0,"l_number"=>0}
{"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
{"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1},
{"created_at"=>"2013-11-19","number"=>5,"s_number"=>45,"l_number"=>7},
{"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}
]现在,我们需要按'created_at‘键对元素进行分组:
raw_data.sum.group_by{|element| element['created_at']}这将导致:
{
"2013-11-17" => [
{"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
{"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
],
"2013-11-18" => [
{"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
{"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1}
], ...
}我们只需要这个散列的值:
raw_data.sum.group_by{|element| element['created_at']}.values
# =>
[
[
{"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
{"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
],
[
{"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
{"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1}
], ...
}现在,我们需要将每个散列数组映射到一个散列。为此,我们将使用带有块的注入和合并函数:
raw_data.sum.group_by{|element| element[:created_at]}.values.map{|a| a.inject({}) {|result, hash| result.merge(hash) {|key, old_value, new_value| key == :created_at ? old_value : old_value + new_value}}}
# =>
[
{"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
{"created_at"=>"2013-11-18","number"=>7,"s_number"=>42,"l_number"=>5},
{"created_at"=>"2013-11-19","number"=>6,"s_number"=>46"l_number"=>8},
{"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}
]发布于 2013-11-20 11:29:20
我会这样做:
result = raw_data.flatten.each_with_object({}) do |hash, result|
date = hash.delete("created_at")
result[date] = Hash.new(0) unless result[date]
hash.each{|key, val| result[date][key] += val}
end.map{|date, hash| hash["created_at"] = date; hash}
p result #=> [{"number"=>2, "s_number"=>3, "l_number"=>4, "created_at"=>"2013-11-17"}, ...或者也许更好,因为它将保持散列的顺序:
result = raw_data.flatten.group_by{|x|x["created_at"]}.values.map do |x|
x.inject do |result, hash|
result.merge(hash){|key, old, new| old.is_a?(String) ? old : old + new }
end
end
p result #=> [{"created_at"=>"2013-11-17", "number"=>2, "s_number"=>3, "l_number"=>4}, {"created_at"=>"2013-11-18", "number"=>7, "s_number"=>42, "l_number"=>5} ...发布于 2013-11-20 11:33:50
output = []
raw_data.flatten.group_by {|x| x[:created_at].to_s}.each do |key, values|
temp_hash = { :created_at => key.to_date }
[:number, :s_number, :l_number].each do |attr|
temp_hash[attr] = values.collect{|w| w[attr]}.sum
end
output << temp_hash
end
# output will contain your resulthttps://stackoverflow.com/questions/20094170
复制相似问题