我有3个相等长度的数组.有些地方是零,这使事情变得复杂,但我需要保留他们的秩序.
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]
Run Code Online (Sandbox Code Playgroud)
(第一步,我想迭代b以便b = [nil, nil, 1.99, nil, nil, nil, nil, nil, nil, nil].只需要["价格"],忽略["大小"].无法弄明白.)
第二步,我要创建一个新的数组(c),其平均a和b,但那里是零,只需要具有价值的一个.换句话说,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,该数组采用两个数字的SMALLER*,或者如果为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]
Run Code Online (Sandbox Code Playgroud)
如果仅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]
Run Code Online (Sandbox Code Playgroud)