我有两个数组:
a = [nil, 1, nil]
b = [4, 5, 6]
我想用第二个数组中的相关元素替换第一个数组中的nil元素:
[4, 1, 6]
最好的方法是什么?
答案 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]
这可以按预期将nil
与false
区分开来。但请注意,您不能将此功能用于to_a
打破的元素,例如哈希。