Ruby - 数组变平

时间:2016-03-02 00:04:57

标签: ruby

我有一个n深度数组,其中n是一个大于或等于2的变量:

[[1,1],[[1,1],[1,1]]]

我想将此数组展平为具有正好2个深度,如下所示:

[[1,1],[1,1],[1,1]]

有人能想出实现这个目标的好方法吗?

3 个答案:

答案 0 :(得分:3)

这应该这样做。

def flatten_after_first(arr)
  arr.flat_map { |a| a.first.is_a?(Array) ? a.map(&:flatten) : [a] }
end

flatten_after_first [[1,1],[[1,1],[1,1]]]
  #=> [[1, 1], [1, 1], [1, 1]]

flatten_after_first [[1,1], [[2,2], [2,2]], [[[3,3], [3,3]], [[3,3], [3,3]]]] 
  #=> [[1, 1], [2, 2], [2, 2], [3, 3, 3, 3], [3, 3, 3, 3]]

答案 1 :(得分:1)

可能会有所帮助

def flat(array)
  array.each do |item|
    if item.is_a?(Array) && item.flatten.count != item.count
      flat(item)
    else
      $arr << item
    end
  end
end

###
$arr = []
collection = [[1, 1], [[1, 1], [1, 1], [[1, 2], [1, 2, 3]]]]
flat(collection)
puts $arr.inspect

=> [[1, 1], [1, 1], [1, 1], [1, 2], [1, 2, 3]]


$arr = []
collection = [[1,1],[[[1,1],[1,1]],[1,1]]]
flat(collection)
$arr
=> [[1, 1], [1, 1], [1, 1], [1, 1]]

答案 2 :(得分:0)

试试这个:

def depth_first_flatten array
  result = []
  array.each do |element|
    if element.first.is_a? Array
      result += deph(element)
    else
      result << element
    end
  end
  result
end

# array = [[1,2],[[3,4],[5,6]]]
# depth_first_flatten(array)
#
# OUTPUT: [[1, 2], [3, 4], [5, 6]]