De重复哈希和数组

时间:2017-06-17 13:06:22

标签: ruby-on-rails arrays ruby sorting hash

我有一系列哈希让我们说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}, .....}

0 个答案:

没有答案