2016-03-02 122 views
2

我具有n深度阵列,其中n是大于变量大于或等于2:红宝石 - 阵列弄平

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

我想变平该数组具有完全相同2的深度,这样的:

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

任何人都可以想出一个很好的方法来实现这一目标吗?

+1

要如何输出目前还不清楚;例如为什么'[[1,1],[1,1]]'变成'[1,1],[1,1]'而不是'[1,1,1,1]'? – brito

+0

更多情况下可能需要获得任何有用的东西。但首先,你有什么尝试?也许[#flatten](http://ruby-doc.org/core-2.3.0/Array.html#method-i-flatten)与一个级别参数?什么? –

回答

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]] 
+0

是的,OP通过在标题中写入“深度优先”来抛弃所有人。他在这个问题中给出的例子不是你在深度第一次变平时得到的结果。但看起来你的答案是他想要的。 –

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]] 
+0

我也用'array = [[1,2],[[3,4],[5,6]],[[[[7,8],[9,10]]]]] ''[1,2],[3,4],[5,6],[7,8],[9,10]]' –

+0

测试'array = [[1,1],[ [1,1],[1,1],[[1,2],[1,2,3]]]]和输出:[[1,1],[1,1],[1, 1],[1,2],[1,2,3]]' –

+0

好挑战!我喜欢! –

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]]