我有一系列哈希让我们说offer = {offer1,...,offer6}。每个报价都是哈希。 每个优惠都有各种键,其中一个是价格哈希值: offer1 = {...,:price => {:amount => 400,:amount2 => 300,:currency => “INR”,...}
现在我想返回一个只包含唯一哈希/优惠的哈希值。此外,我希望:price
哈希值具有平均值。
因此,最终商品数组将具有:
offers=[offer1, offer2,...]
offer1[:price]
的值等于来自重复商品哈希值的每个键值的平均值,与offer2[:price] and so on
相同,因此最后我以只有唯一商品的哈希值结束。
offers1..6可以重复使用相同的ID和价格哈希不同。如果它们是重复的,我们需要进行平均,否则不会。
有没有一种优雅的方式来做所有这些? 我尝试使用唯一键对哈希进行分组并合并每个哈希的价格哈希值。但我无法达成最终解决方案。
我的尝试:
rooms_hash = rooms.map do |room|
unless room[:offers].uniq.count == room[:offers].count
grouped_offers = room[:offers].group_by{|x| x[:room_category_id]}
offer_values = grouped_offers.values
price_array = offer_values.map do |v|
v.inject do |k, v|
k.merge!(price: k[:price].merge(v[:price]){|_, a, b| [a, b].flatten })
end
end
price_array.map do |o|
o[:price] = {}.tap{ |h| o[:price].each {|k, list| h[k] = list.all?{|e| [Fixnum, NilClass].include? e.class} ? list.map(&:to_i).sum/list.size : list.compact.first ; h } }
end
price_array
end
end
rooms.zip(rooms_hash).map do |room,averaged_offers|
if room[:offers].count > 1
room[:offers] = averaged_offers.select{|offer| offer[:room_category_id] == room[:room_category_id]}
room
end
end
当我没有得到任何重复项时,此代码实际上失败了。那么我该如何检查呢?
编辑:
Yes offers是一个数组,offer1..6是哈希。
offer1 ..._ hash = {:offer_id=>"uuid", :price=>{:amount=>4422380, :gross_amount=>4422380, :currency=>"INR", :tax=>434318, :hotel_fees=>0, :base_fare=>3988062}, .....}