563 Stimmen

Wie kann man in Ruby ein Array zu einem anderen Array hinzufügen, ohne dass das Ergebnis mehrdimensional ist?

Ich habe es versucht:

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)

Ich erwartete

["some", "thing", "another", "thing"]

aber bekam

["some", "thing", nil]

818voto

pilcrow Punkte 53851

Sie haben eine brauchbare Idee, aber die #flatten! ist an der falschen Stelle - er flacht den Empfänger ab, so dass man ihn zum Drehen verwenden könnte [1, 2, ['foo', 'bar']] in [1,2,'foo','bar'] .

Zweifellos habe ich einige Ansätze vergessen, aber Sie können verketten :

a1.concat a2
a1 + a2              # creates a new array, as does a1 += a2

o vorangestellt/angehängt :

a1.push(*a2)         # note the asterisk
a2.unshift(*a1)      # note the asterisk, and that a2 is the receiver

o Spleiß :

a1[a1.length, 0] = a2
a1[a1.length..0] = a2
a1.insert(a1.length, *a2)

o anhängen und platt machen :

(a1 << a2).flatten!  # a call to #flatten instead would return a new array

226voto

micmoo Punkte 5941

Sie können einfach die + Betreiber!

irb(main):001:0> a = [1,2]
=> [1, 2]
irb(main):002:0> b = [3,4]
=> [3, 4]
irb(main):003:0> a + b
=> [1, 2, 3, 4]

Alles über die Array-Klasse können Sie hier nachlesen: http://ruby-doc.org/core/classes/Array.html

85voto

WebDev Punkte 1057

Der sauberste Ansatz ist die Verwendung der Array#concat Methode; es wird kein neues Array erstellt (im Gegensatz zu Array#+, das das Gleiche tut, aber ein neues Array erstellt).

Direkt aus den Unterlagen ( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):

concat(andere_ary)

Hängt die Elemente von other_ary an self an.

Also

[1,2].concat([3,4])  #=> [1,2,3,4]  

Array#concat wird ein mehrdimensionales Array nicht glätten, wenn es als Argument übergeben wird. Sie müssen das separat behandeln:

arr= [3,[4,5]]
arr= arr.flatten   #=> [3,4,5]
[1,2].concat(arr)  #=> [1,2,3,4,5]

Schließlich können Sie auch unser Corelib-Gem verwenden ( https://github.com/corlewsolutions/corelib ), die den Ruby-Kernklassen nützliche Helfer hinzufügt. Insbesondere haben wir eine Array#add_all Methode, die mehrdimensionale Arrays vor der Ausführung der Verknüpfung automatisch glättet.

45voto

snibbets Punkte 937
a = ["some", "thing"]
b = ["another", "thing"]

Zum Anhängen b a a und speichern das Ergebnis in a :

a.push(*b)

o

a += b

In jedem Fall, a wird:

["some", "thing", "another", "thing"]

aber im ersten Fall sind die Elemente von b werden an die bestehenden a Array, und im letzteren Fall werden die beiden Arrays miteinander verkettet und das Ergebnis wird in a .

43voto

Ludovic Kuty Punkte 4799

Einfache Methode, die mit Ruby-Versionen >= 2.0, aber nicht mit älteren Versionen funktioniert:

irb(main):001:0> a=[1,2]
=> [1, 2]
irb(main):003:0> b=[3,4]
=> [3, 4]
irb(main):002:0> c=[5,6]
=> [5, 6]
irb(main):004:0> [*a,*b,*c]
=> [1, 2, 3, 4, 5, 6]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X