我有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]
(第一步,我想迭代b以便b = [nil, nil, 1.99, nil, nil, nil, nil, nil, nil, nil]
。只需要[“price”],忽略[“size”]。无法弄明白。 )
第二步,我想创建一个平均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
而不是{{1 }})
我知道这些步骤很乏味,但我需要按顺序进行,因为我有很多数组,我需要平均2然后与第三个进行比较,并采用更大的数字和随机的nil值,它得到超出我的能力。无法弄清楚,并会非常感谢一些帮助!谢谢!
答案 0 :(得分:6)
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]
答案 1 :(得分:2)
第1步。
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]) }