用另一个数组的元素替换数组中的nil,最佳方法是什么?

3

我有两个数组:

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

我希望你能帮我将第一个数组中的空元素替换为第二个数组中对应的元素:

[4, 1, 6]

什么是最佳实践?
5个回答

6
你可以使用 zip|| 运算符来完成它:
result = a.zip(b).map{ |x,y| x || y } 

4
请注意,如果 a 包含 false,则此操作将失败。 - ndnenkov
1
如果您不关心假值,[a, b].transpose.map {|f, s| f || s}同样适用 :) - Ilya

5
如果您想替换精确的nil元素,而不是false元素:
a.map.with_index { |e, i| e.nil? ? b[i] : e }
# => [4, 1, 6]

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 元素不会被删除。

2
a.zip(b).map { |e| e.compact[0] } 2 次迭代,而不是 3 次 :) - Ilya

3
另一种方法是在创建新数组时,使用块如下:(创建数组的链接)
a = [nil, 1, nil]
b = [4, 5, 6]
Array.new(a.size) { |i| a[i].nil? ? b[i] : a[i] }
#=> [4, 1, 6]

0

还有另一种变体:

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

这将nilfalse区分开来,正如预期的那样。但请注意,您不能将此方法用于由to_a破坏的元素,例如哈希值。

@ndn 是的,你说得对。我也在考虑这个问题。 - sawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接