2013-06-24 2 views
2

У меня есть этот массив:Как придавить сокровенный массив

[[["a", "c"], "e"], 
[["a", "c"], "f"], 
[["a", "c"], "g"], 
[["a", "d"], "e"], 
[["a", "d"], "f"], 
[["a", "d"], "g"], 
[["b", "c"], "e"], 
[["b", "c"], "f"], 
[["b", "c"], "g"], 
[["b", "d"], "e"], 
[["b", "d"], "f"], 
[["b", "d"], "g"]] 

Я хотел бы, чтобы превратить его в это:

[["a", "c", "e"], 
["a", "c", "f"], 
["a", "c", "g"], 
["a", "d", "e"], 
["a", "d", "f"], 
["a", "d", "g"], 
["b", "c", "e"], 
["b", "c", "f"], 
["b", "c", "g"], 
["b", "d", "e"], 
["b", "d", "f"], 
["b", "d", "g"]] 

Как я могу сделать это с помощью Ruby? Я смотрел на сплюснутый, кажется, работает извне, а не изнутри.

+1

Вы можете захотеть взглянуть на почему вы получая массив в первой форме, а не второй. Когда я вижу данные в первой форме, это обычно потому, что я сделал что-то неправильно и мне нужно пересмотреть мой код. –

+0

@theTinMan, хороший пункт. Я получаю данные в этой форме в результате вызова продукта. Я отправлю синтаксис вызова, чтобы показать, как он был сгенерирован. –

+0

Это работает. Часто мы рассматриваем вопросы, связанные с симптомом, поскольку кто-то ищет повязку, когда реальной проблеме нужно немного рефакторинга или другого подхода, который заканчивается фиксацией большого количества другого кода. –

ответ

4

или попробовать arr.each {|i| i.flatten!}

+0

Это зависит от того, хотите ли вы разрушительную или неразрушающую версию. Ответ OMG является неразрушающим. –

+2

@JanDvorak да, но op сказал: «Я хотел бы превратить его в это», поэтому я думаю, что оригинал не понадобится – leonhart

+0

Спасибо, я выбрал это, потому что мне не нужен оригинал. Хотел бы я дать половину проверки на оба ответа. Всем спасибо. –

9

Вы можете использовать flatten и map:

ar.map! {|i| i.flatten} 
# => [["a", "c", "e"], 
#  ["a", "c", "f"], 
#  ["a", "c", "g"], 
#  ["a", "d", "e"], 
#  ["a", "d", "f"], 
#  ["a", "d", "g"], 
#  ["b", "c", "e"], 
#  ["b", "c", "f"], 
#  ["b", "c", "g"], 
#  ["b", "d", "e"], 
#  ["b", "d", "f"], 
#  ["b", "d", "g"]] 

Еще один лайнер будет:

ar.map!(&:flatten) 

# => [["a", "c", "e"], 
#  ["a", "c", "f"], 
#  ["a", "c", "g"], 
#  ["a", "d", "e"], 
#  ["a", "d", "f"], 
#  ["a", "d", "g"], 
#  ["b", "c", "e"], 
#  ["b", "c", "f"], 
#  ["b", "c", "g"], 
#  ["b", "d", "e"], 
#  ["b", "d", "f"], 
#  ["b", "d", "g"]] 
+1

Примечание '&: flatten' требует не менее Ruby 1.9.3 или аналогичной версии. –

+0

@JanDvorak Должен ли я упоминать об этом в сообщении, поэтому я дал две формы ответов. –

+1

Добавление информации о версии в ответ всегда приятно. «Так как 1.x.x, вы также можете сделать \ n ...» –

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