Ruby: Как объединить массив массивов в один - PullRequest
65 голосов
/ 27 ноября 2011

У меня есть массив массивов в Ruby on Rails (3.1), где все внутренние массивы имеют разный размер. Есть ли способ легко объединить все внутренние массивы, чтобы получить один большой одномерный массив со всеми элементами?

Я знаю, что вы можете использовать функцию Array :: concat для объединения двух массивов, и я мог бы сделать цикл для последовательного объединения их следующим образом:

concatenated = Array.new
array_of_arrays.each do |array|
    concatenated.concat(array)
end

но я хотел бы знать, если бы был один лайнер Ruby, который бы делал это более чистым способом.

Спасибо за вашу помощь.

Ответы [ 3 ]

148 голосов
/ 27 ноября 2011

Вы ищете #flatten:

concatenated = array_of_arrays.flatten

По умолчанию это рекурсивно сгладит списки. #flatten принимает необязательный аргумент для ограничения глубины рекурсии - в документации приведены примеры, иллюстрирующие разницу.

27 голосов
/ 27 ноября 2011

Или, в более общем смысле:

array_of_arrays.reduce(:concat)
4 голосов
/ 29 июля 2017

Вы можете использовать flatten!метод.например.a = [ 1, 2, [3, [4, 5] ] ] a.flatten! #=> [1, 2, 3, 4, 5]

...