2016-08-02 6 views
1

gleicher Größe hat ich habe den folgenden Code:Wie mehrere Arrays in Ruby zu verbinden, die

prices = [["12.34", "23.12"], ["12.22", "66.11", "33.66", "11.11"], ["32.12"]] 
names = [["dog", "pog"], ["foo", "bar", "baz", "zed"], ["qwerty"]] 
numbers = [["2", "3"], ["12", "33", "444", "3023"], ["33393"]] 
pics = [["url", "url"], ["url", "url", "url", "url"], ["url"]] 
chars = ["A", "B", "C"] 

Wie Arrays zu verbinden, dass das Ergebnis-Array wird:

[["12.34", "dog", "2", "url", "A"], ["23.12", "pog", "3", "url", "A"], 
["12.22", "foo", "12", "url", "B"], ["66.11", "bar", "33", "url", "B"], 
... 
["32.12", "qwerty", "33393", "url", "C"]] 

tryed I-Arrays verbinden durch Zip-Methode, aber Ergebnis war:

[[["12.34", "23.12"], ["dog", "pog"], ["2", "3"], ["url", "url"], ["A", "B", "C"]]] 
... 
+0

Bitte fügen Sie einige Codebeispiel. – Algorithmist

Antwort

3

So etwas sollte es tun:

chars.map.with_index {|char, i| 
    prices[i].zip(names[i], numbers[i], pics[i], [char].cycle) 
}.flatten(1) 
+0

Danke, aber es produziert: [["12.34", "Hund", "2", "url", ["A", "B", "C"], "23.12", "Pog", "3" , "url", ["A", "B", "C"]]] –

+0

Kein Weg. Obwohl diese Lösung meiner bescheidenen Meinung nach etwas nachgiebig ist, ist sie vollkommen korrekt. – mudasobwa

+0

ja, mein Fehler (zusätzliche Klammern in Chars Array), tut mir leid. Danke Jörg W Mittag & & mudasobwa –

1
arr = [ 
    [["12.34", "23.12"], ["12.22", "66.11", "33.66", "11.11"], ["32.12"]], 
    [["dog", "pog"], ["foo", "bar", "baz", "zed"], ["qwerty"]], 
    [["2", "3"], ["12", "33", "444", "3023"], ["33393"]], 
    [["url", "url"], ["url", "url", "url", "url"], ["url"]], 
    ["A", "B", "C"] 
] # == [prices,names,numbers,pics,chars] 

arr.transpose.map do |e| 
    e[0...-1].reduce(:zip).map { |r| r.flatten << e.last } 
end 
0
e = chars.cycle 
    #=> #<Enumerator: ["A", "B", "C"]:cycle> 
[prices, names, numbers, pics].map(&:flatten).transpose.map { |arr| arr << e.next } 
    #=> [["12.34", "dog",  "2", "url", "A"], 
    # ["23.12", "pog",  "3", "url", "B"], 
    # ["12.22", "foo",  "12", "url", "C"], 
    # ["66.11", "bar",  "33", "url", "A"], 
    # ["33.66", "baz",  "444", "url", "B"], 
    # ["11.11", "zed",  "3023", "url", "C"], 
    # ["32.12", "qwerty", "33393", "url", "A"]] 

Die Schritte:

a = [prices, names, numbers, pics].map(&:flatten) 
    #=> [["12.34", "23.12",..."32.12"], 
    # ["dog", "pog",..."qwerty"], 
    # ["2", "3",..."33393"], 
    # ["url",...,"url"]] 
b = a.transpose 
    #=> [["12.34", "dog", "2", "url"], 
    # ["23.12", "pog", "3", "url"], 
    # ... 
    # ["32.12", "qwerty", "33393", "url"]] 
b.map { |arr| arr << e.next } 
    #=> the above result