数组 – 从数组中添加哈希值
发布时间:2020-12-17 03:42:53 所属栏目:百科 来源:网络整理
导读:我试图从具有相同键和平均值的多个哈希数组创建数组/哈希.我的阵列: [{:amount=897500,:gross_amount=897500,:tax=147500,:hotel_fees=0,:base_fare=750000,:currency="INR"},{:amount=1006500,:gross_amount=1006500,:tax=156500,:base_fare=850000,:curre
我试图从具有相同键和平均值的多个哈希数组创建数组/哈希.我的阵列:
[{:amount=>897500,:gross_amount=>897500,:tax=>147500,:hotel_fees=>0,:base_fare=>750000,:currency=>"INR"},{:amount=>1006500,:gross_amount=>1006500,:tax=>156500,:base_fare=>850000,:currency=>"INR"}] 现在我想返回这样的东西: {:amount=>952000,:gross_amount=>952000,:tax=>152000,:base_fare=>800000,:currency=>"INR"} 其中value是具有相同键的每个散列的值的平均值. 有一个简单的方法来做到这一点.我尝试过使用合并但货币变为0. 我的尝试: p[0].merge(p[1]){|k,v1,v2| (v1+v2)/2 unless v1 && v2 == "INR"} 编辑: 实际上我的问题并没有在这里结束,所以在获得平均值后我需要在另一个哈希中插入值. 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 其中offer_array是我的原始/第一个数组在单独的哈希中的那个.我试过2和3个哈希,它正在工作. 如果你们有任何改进代码的建议,它是开放的. 解决方法
对于数组中的两个哈希,如果两个货币键的值都是Fixnum类,则可以使用注入和合并检查,如果没有,则在第一个哈希值中使用货币“INR”的值并使用它:
array = [ {:amount=>897500,:currency=>"INR"} ] p array.inject{|k,v| k.merge(v){|_,b].all?{|e| e.is_a?(Fixnum)} ? (a+b)/2 : b}} # => {:amount=>952000,:currency=>"INR"} 对于阵列中的两个或更多哈希,您可以尝试: main_array = [ {:amount=>897500,] array_result = main_array.flat_map(&:to_a).group_by(&:first).map do |key,array| { key => ( result = array.inject(0) do |total,(_,value)| value.is_a?(Fixnum) ? total + value : value end result.is_a?(Fixnum) ? result / main_array.size : result ) } end p array_result (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |