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

Arrays Ruby:比较数组并根据特定条件创建新数组,arrays,ruby,Arrays,Ruby,我有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,

我有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
,该数组取两个数字中较小的*,如果为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]
如果只需要
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步。

b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  } 
第2步。

b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  } 
第3步。

b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  } 

第1步。

b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  } 
第2步。

b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  } 
第3步。

b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  } 

1.
a
b
x
的长度是否始终相同?2.
a
是否可以包含任何
nil
元素?3.考虑到“第三步”阵列可以在不首先构造其他两个阵列的情况下构造,您希望通过“第一步”和“第二步”生成阵列,还是仅通过“第三步”生成阵列。
b
是否可以包含整数以及
nil
和包含散列的数组?1。是的。我不这么认为,它来自一个json,我仍在探索,还没有遇到任何json。3.tbh,我真的只需要第三步,所以谢谢你下面的回答!4.b将仅包含
nil
或包含显示的哈希的数组。很好的后续问题,谢谢你下面的精彩回答!1.
a
b
x
的长度是否始终相同?2.
a
是否可以包含任何
nil
元素?3.考虑到“第三步”阵列可以在不首先构造其他两个阵列的情况下构造,您希望通过“第一步”和“第二步”生成阵列,还是仅通过“第三步”生成阵列。
b
是否可以包含整数以及
nil
和包含散列的数组?1。是的。我不这么认为,它来自一个json,我仍在探索,还没有遇到任何json。3.tbh,我真的只需要第三步,所以谢谢你下面的回答!4.b将仅包含
nil
或包含显示的哈希的数组。很好的后续问题,谢谢你下面的精彩回答!我更愿意执行步骤1,然后在步骤3中得到结果,因此您是否会提醒我使用
bb
而不是
b
重新编写第二个代码?非常感谢。我做了你要求的更改。谢谢你,这很好用!如果你不介意的话,我还有一个标准要补充!我想你不到一分钟就能解决它。我将不胜感激。请随意在上面或要点中添加答案。我自己尝试过,虽然不漂亮,但完成了工作
b.each.with_index{e,i | if e.nil?&x[i].nil?;b.delete_at(i);p.delete_at(i);a.delete_at(i);x.delete_at(i);end}
会在
转置
映射
之间插入{reject{ae ae abe,xe ae nil?&xe nil},以实现您的目标?我希望在第1步,然后在第3步中得到结果,因此,您是否会提醒您使用
bb
而不是
b
重新编写第二个代码?非常感谢。我做了你要求的更改。谢谢你,这很好用!如果你不介意的话,我还有一个标准要补充!我想你不到一分钟就能解决它。我将不胜感激。请随意在上面或要点中添加答案。我自己尝试过,虽然不漂亮,但完成了工作
b.each.with_index{e,i|if e.nil?&x[i].nil?;b.delete_at(i);p.delete_at(i);a.delete_at(i);x.delete_at(i);end}
transpose
map
之间插入`拒绝{ae ae,bbe,xe,xe | ae.nil?&xe}可以实现你的目标吗?