我将尝试从一个Ruby哈希表中求和,但使用inject或reduce方法都不能返回正确的答案。似乎这些方法在累加值时覆盖了当前存储的值,而不是对它们进行求和。
我的哈希表长这样:
我有一个哈希表,我想对除第一个日期以外的所有键的总数进行求和。
目前我得到的结果如下:
我的哈希表长这样:
@test = [
{"total"=>18, "type"=>"buy", "date"=>Thu, 21 Nov 2013, "instrument_code"=>"food"},
{"total"=>92, "type"=>"buy", "date"=>Thu, 14 Nov 2013, "instrument_code"=>"food"},
{"total"=>12, "type"=>"buy", "date"=>Wed, 20 Nov 2013, "instrument_code"=>"drink"},
{"total"=>1, "type"=>"buy", "date"=>Mon, 11 Nov 2013, "instrument_code"=>"food"}
]
这是我的注入代码,但它失败了:
def additions_per_security
@test.group_by { |i| i.type }.each do |key, value|
if key == "buy"
value.group_by{ |i| i.date }.each do |key, value|
@sortable_additions[key] = value
end
@sorted_additions = @sortable_additions.sort_by { |key,value| key }
@sorted_additions.shift
@additions_per_security = Hash[@sorted_additions.map { |key, value|
[key, value]
}]
@additions_per_security.each do |key, value|
value.group_by { |i| i.instrument_code }.each do |key, value|
@additions_security[key] = value.inject(0){ |result, transaction|
(result += transaction.total)
}
end
end
end
end
return @additions_security
end
这是我的reduce代码,但它失败了:
def additions_per_security
@@test.group_by { |i| i.type }.each do |key, value|
if key == "buy"
value.group_by { |i| i.date }.each do |key, value|
@sortable_additions[key] = value
end
@sorted_additions = @sortable_additions.sort_by { |key,value| key }
@sorted_additions.shift
@additions_per_security = Hash[@sorted_additions.map { |key, value|
[key, value]
}]
@additions_per_security.each do |key, value|
value.group_by { |i| i.instrument_code }.each do |key, value|
@additions_security[key] = value.map { |p| p.total }.reduce(0,:+)
end
end
end
end
return @additions_security
end
我有一个哈希表,我想对除第一个日期以外的所有键的总数进行求和。
目前我得到的结果如下:
{"drink"=>12.0, "food"=>92}
我的期望结果会像这样:
{"drink"=>12.0, "food"=>110}
提前感谢任何建议。
@testhash
不是一个散列。如果你将外部的{}
更改为[]
,它将成为一组散列;现在它不是一个Ruby对象。另外,reduce
和inject
是同义词。最好简化并修复@testhash
,通过删除不必要的哈希元素来实现。特别是日期不相关,但可能会引起复杂情况。 - Cary Swoveland@testhash
中删除“哈希”。请编辑以澄清。 - Cary Swoveland