我有三个长度相等的数组。有些位置是nil,这会使事情变得复杂,但我需要保留它们的顺序。
a = [5.2, 3.0, 1.21, 7.0, 5.0, 5.0, 6.0, 8.0, 10.0, 10.0]
b = [nil, nil, [{"price"=>1.99, "size"=>269.897475661239}], nil, nil, nil, nil, nil, nil, nil]
x = [6.0, 6.2, 2.5, 5.0, 9.0, 2.36, 15.5, 20.0, nil, nil]
(第一步,我想迭代b,使b = [nil, nil, 1.99, nil, nil, nil, nil, nil, nil, nil]
。只需要["价格"],忽略["尺寸"]。)
第二步,我想创建一个新的数组(c
),平均a
和b
,但那里有nil,只是拿一个有值。换句话说,c
将= [5.2, 3.0, 1.6, 7.0, 5.0, 5.0, 6.0, 8.0, 10.0, 10.0]
,看起来像a
,除了第三个点1.21和1.99的平均值(1.6)。
那么我就有了原来的第三个数组x = [6.0, 6.2, 2.5, 5.0, 9.0, 2.36, 15.5, 20.0, nil, nil]
。第三步,我想比较c
和x
,并创建一个新的数组z
,它接受两个数字中较小的*,或者如果为nil,则有值的那个。z
是我想要的结果
因此z
应该是= [6.0, 6.2, 2.5, 7.0, 9.0, 5.0, 15.5, 20.0, 10.0, 10.0]
(如果我的眼睛是正确的)。(*编辑:我的意思是两个数字中较大的,这就是为什么这个数组不匹配下面的答案,所以我使用下面的答案,但使用.max
而不是.min
)
我知道这些步骤很乏味,但我需要按照这个顺序进行,因为我有很多数组,我需要平均2,然后与第三个数组进行比较,并取较大的数字,并随机添加nil值,这超出了我的能力。不能理解,并将非常感谢一些帮助!谢谢你!
bb = b.map { |e| e.is_a?(Array) ? e.first["price"] : e }
#=> [nil, nil, 1.99, nil, nil, nil, nil, nil, nil, nil]
c = a.zip(bb).map { |ea, ebb| ebb.nil? ? ea : (ea+ebb)/2.0 }
#=> [5.2, 3.0, 1.6, 7.0, 5.0, 5.0, 6.0, 8.0, 10.0, 10.0]
c.zip(x).map { |cc,xx| xx.nil? ? cc : [cc,xx].min }
#=> [5.2, 3.0, 1.6, 5.0, 5.0, 2.36, 6.0, 8.0, 10.0, 10.0]
如果只需要bb
和返回值,您可以执行以下计算:
[a,bb,x].transpose.map do |ae,bbe,xe|
ab_avg = bbe ? (ae+bbe)/2.0 : ae
xe ? [ab_avg, xe].min : ab_avg
end
#=> [5.2, 3.0, 1.6, 5.0, 5.0, 2.36, 6.0, 8.0, 10.0, 10.0]
第一步
b.map!{ |x| x.first.values.first if x }
步骤2 。
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
步骤3。
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }