2013-06-24 62 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

你可以使用flattenmap

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 ...」 –