使用另一个数组的元素替换数组中的nils的最佳方法

时间:2017-04-12 07:18:34

标签: arrays ruby

我有两个数组:

a = [nil, 1, nil]
b = [4, 5, 6]

我想用第二个数组中的相关元素替换第一个数组中的nil元素:

[4, 1, 6]

最好的方法是什么?

5 个答案:

答案 0 :(得分:6)

您可以使用zip||运算符来执行此操作:

result = a.zip(b).map{ |x,y| x || y } 

答案 1 :(得分:5)

如果您想要完全替换nil,而不是false元素:

a.map.with_index { |e, i| e.nil? ? b[i] : e }
# => [4, 1, 6]

答案 2 :(得分:5)

您可以使用

a.zip(b).map(&:compact).map(&:first) #=> [4, 1, 6]

步骤:

a.zip(b)
#=> [[nil, 4], [1, 5], [nil, 6]]
a.zip(b).map(&:compact)
#=> [[4], [1, 5], [6]]
a.zip(b).map(&:compact).map(&:first)
#=> [4, 1, 6]

根据Array#compact,此方法仅从压缩对中删除nil元素,即false元素不会被删除。

答案 3 :(得分:3)

另一种方法是在creating this new array时使用块,如下所示:

a = [nil, 1, nil]
b = [4, 5, 6]
Array.new(a.size) { |i| a[i].nil? ? b[i] : a[i] }
#=> [4, 1, 6]

答案 4 :(得分:0)

还有另一种变体:

a.zip(b).map{|a, b| [*a, *b].first}
# => [4, 1, 6]

这可以按预期将nilfalse区分开来。但请注意,您不能将此功能用于to_a打破的元素,例如哈希。