2016-05-17 5 views
3

У меня есть массив как следующийРубин внутренняя Flatten (массив массивов)

[ 
    [[0, :a], [2, :b]], 
    [3, :c], 
    [4, :d], 
    [[5, :e], [6, :f], [7, :g]] 
] 

То есть массив элементов, которые являются либо (1) 2-элементные массивы, или (2) массив 2-элементные массивы.

Я пытаюсь найти элегантный способ «сгладить» этот массив таким образом, чтобы элементы, которые (2), были расширены в элементы корневого уровня. В этом примере:

[[0, :a], [2, :b], [3, :c], [4, :d], [5, :e], [6, :f], [7, :g]] 

Это почти как с помощью Array#flatten(depth), за исключением depth потребности работать изнутри, а не снаружи в

Фактические массивы могут быть очень большими, поэтому у меня нет. хотите нажимать (<<) элементы на новый массив в цикле по соображениям производительности. По какой-то причине я не могу придумать, как использовать любую комбинацию map, flatten, flat_map или другие более эффективные методы Enumerable для этого, не создавая цикл preallocate-and-populate в стиле C++. Может ли кто-нибудь подумать о более рубистском способе сделать это?

ответ

7

Один из способов сделать это:

array.flatten.each_slice(2).to_a 
1

Проводка другое решение здесь для потомков:

array.flat_map{|el| el.first.is_a?(Array) ? el : [el]} 

Это решение также ручки, если сокровенные Массивы переменной длины - то есть, общее Массив - это массив (1) n-элементов массивов или (2) массивы n-элементов массивов, где n не обязательно одинаково для любого заданного элемента. Например,

[ 
    [1,2,3], 
    [[4,5], [6,7,8,9]] 
] 

 Смежные вопросы

  • Нет связанных вопросов^_^