嗨,我找到了平均值 这就是我想要做的事情
我有基于user_id和company_id从db获取的一组变量变量是和我无法添加然后因为我需要在我的显示页面中显示单个参数而我还想显示它们的平均值<登记/> 所以我想尝试如下
@r1=company_rating.collect(&:r1)
@r2=company_rating.collect(&:r2)
@r3=company_rating.collect(&:r3)
@r4=company_rating.collect(&:r4)
所以我这样做
arr = [@r1,@r2,@r3,®r4]
@totalaverage= arr.sum.compact /arr.size
My array sample looks like [10,20,30,nil],[nil,nil,nil,nil],[30,40,50,60]
如果我的阵列都是Nil那么它应该显示为Nil 但我得到一个错误未定义的方法`/'为#和为什么我做紧凑是因为我有nil值的总和
所以请帮忙怎么做。
答案 0 :(得分:1)
按以下步骤操作:
@totalaverage= arr.flat_map(&:compact).inject(:+) /arr.size.to_f
实际上@totalaverage
是一个数组数组。其中@totalaverage
的每个内部元素(数组)也可以具有nil
值(如您所示)。因此,您需要从nil
的内部数组中删除@totalaverage
条目(如果有)。 arr.map(&:compact)
将完成同样的工作。
答案 1 :(得分:1)
首先,您将arr
定义为数组数组。 @ r1 , @ r2 等都是数组,[@r1, @r2, ...]
所做的就是将它们混合在另一个数组中。您可能希望合并它们,而不是将它们包含在另一个数组中:
arr = @r1 + @r2 + @r3 + @r4
其次,您应首先调用arr.compact
,然后将内容加起来。另外,我不确定sum
方法。我会改用reduce(&:+)
。因此,要回答您的问题,“/”会失败,因为compact
会返回数组,并且您尝试将数组划分为数字。这看起来更好:
arr = @r1 + @r2 + @r3 + @r4
@totalaverage = arr.compact.reduce(&:+) / arr.size
Array#reduce(&:+)
做的是在数组成员之间应用+
运算符并返回值(不是数组)。
编辑 arr.sum
可以工作。否则请改用arr.reduce(&:+)
。
答案 2 :(得分:0)
如果您使用Rails,最简单的方法是执行此操作:
@totalaverage = a.flatten.compact.sum.to_f / a.flatten.compact.size if a.flatten.compact.present?
如果所有值均为@totalaverage
,则会将结果分配给nil
或nil
。