Ruby:比较数组并根据特定条件创建新数组



我有三个长度相等的数组。有些位置是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),平均ab,但那里有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]第三步,我想比较cx,并创建一个新的数组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])  } 

最新更新