【问题标题】:What is the best way to merge two arrays (element + element), if elements itself are arrays如果元素本身是数组,则合并两个数组(元素+元素)的最佳方法是什么
【发布时间】:2020-11-30 01:06:12
【问题描述】:

我有两个大小相等的嵌套数组:

Array1 =[[1, 2], [], [2, 3]]
Array2= [[1, 4], [8, 11], [3, 6]]

我需要将它们合并到一个数组中,如下所示:

Array = [[1,2,1,4], [8,11], [2,3,3,6]],

所以新Array[x] = Array1[x] + Array2[x]的每个元素

我了解如何使用for(each) 循环来做到这一点,但我确信 Ruby 对此有一个优雅的解决方案。也有可能通过更改Array1产生解决方案。

【问题讨论】:

    标签: arrays ruby merge nested


    【解决方案1】:
    [Array1, Array2].transpose.map(&:flatten) 
    => [[1, 2, 1, 4], [8, 11], [2, 3, 3, 6]]
    

    RubyGuides: "Turn Rows Into Columns With The Ruby Transpose Method"


    解释每个步骤:

    [Array1, Array2]
    => [[[1, 2], [], [2, 3]], 
        [[1, 4], [8, 11], [3, 6]]]
    

    创建一个类似数组的网格。

    [Array1, Array2].transpose
    => [[[1, 2], [1, 4]], [[], [8, 11]], [[2, 3], [3, 6]]]
    

    transpose 切换行和列(接近我们想要的)

    [Array1, Array2].transpose.map(&:flatten)
    => [[1, 2, 1, 4], [8, 11], [2, 3, 3, 6]]
    

    flatten 去掉了不必要的嵌套数组(这里结合map 访问嵌套数组)

    【讨论】:

    • zip 方法也可以解决问题:Array1.zip(Array2).map(&:flatten)
    • @a5zima 你能把它作为工作答案吗?我需要声誉才能最终能够投票... ;-)
    【解决方案2】:

    我会这样做:

    array1 =[[1, 2], [], [2, 3]]
    array2= [[1, 4], [8, 11], [3, 6]]
    
    array1.zip(array2).map(&:flatten)
    # => [[1, 2, 1, 4], [8, 11], [2, 3, 3, 6]]
    

    【讨论】:

    • 虽然有点啰嗦,但我觉得array1.zip(array2).map{|a, b| a + b}更能表达意图。
    • 然后我们问自己 15 年来我一直在问自己的两个问题:为什么 zip 使用块首先压缩两个元素,然后生成组合数组而不是生成两个元素分开,为什么zip 带有一个块充当副作用循环而不是变压器。因为那时,Array1.zip(Array2, &:+) 会起作用,就像每个使用zip 的人第一次认为它会起作用,然后惊讶于它不起作用:-D
    【解决方案3】:
    Array1.each_index.map { |i| Array1[i] + Array2[i] }
      #=> [[1,2,1,4], [8,11], [2,3,3,6]]
    

    这样做的好处是可以避免创建临时数组[Array1, Array2].transposeArray1.zip(Array2)

    【讨论】:

    • 这个答案也可以很容易地推广到超过 2 个数组,或者更复杂的数组(哈希数组等),同时保持代码的清晰度。
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 2010-10-11
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多