我有两个数组:
a = [nil, 1, nil]
b = [4, 5, 6]
我希望你能帮我将第一个数组中的空元素替换为第二个数组中对应的元素:
[4, 1, 6]
什么是最佳实践?
zip
和 ||
运算符来完成它:result = a.zip(b).map{ |x,y| x || y }
nil
元素,而不是false
元素:a.map.with_index { |e, i| e.nil? ? b[i] : e }
# => [4, 1, 6]
您可以使用
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
元素不会被删除。a.zip(b).map { |e| e.compact[0] }
2 次迭代,而不是 3 次 :) - Ilyaa = [nil, 1, nil]
b = [4, 5, 6]
Array.new(a.size) { |i| a[i].nil? ? b[i] : a[i] }
#=> [4, 1, 6]
还有另一种变体:
a.zip(b).map{|a, b| [*a, *b].first}
# => [4, 1, 6]
nil
与false
区分开来,正如预期的那样。但请注意,您不能将此方法用于由to_a
破坏的元素,例如哈希值。
a
包含false
,则此操作将失败。 - ndnenkov[a, b].transpose.map {|f, s| f || s}
同样适用 :) - Ilya