Sechs Ruby-Array-Methoden, die Sie kennen müssen

Arrays sind eine der grundlegenden Strukturen der Programmierung. Die Fähigkeit, Daten schnell zu bearbeiten und daraus zu lesen, ist entscheidend für den Erfolg beim Erstellen von Computern. Hier sind sechs Methoden, auf die Sie nicht verzichten können.

Karte / jeweils

Diese beiden Methoden sind sehr ähnlich. Mit ihnen können Sie „jedes“ Element in einem Array durchgehen und etwas dagegen tun.

Schauen Sie sich einen Code an:

array = [1, 2, 3] effects = array.each # create record from x  added = array.map x + 2 

Wenn wir von lesen added, werden wir bekommen [3, 4, 5]. Wenn wir von lesen effects, werden wir immer noch bekommen [1, 2, 3]. Hier ist der Unterschied zwischen diesen beiden: .mapGibt ein neues modifiziertes Array zurück, während .eachdas ursprüngliche Array zurückgegeben wird.

Nebenwirkungen in der Karte

Wenn Sie an funktionale Programmierung gewöhnt sind, .mapscheint Ruby sehr seltsam zu sein. Schauen Sie sich dieses Beispiel an. Ich habe eine einfache EventKlasse in meinem Projekt:

# we create an array of records 2.3.0 :025 > array = [e, e2, e3] => [#, #, #] # so far so good 2.3.0 :026 > new_array = array.map => [#, #, #] # uh-oh, that ain't right 2.3.0 :027 > array => [#, #, #]

Wir können erwarten, dass wir mit einer Art Kopie unserer Datensätze im Array arbeiten, aber wir sind es nicht. Das ist alles nur um zu sagen: Sei vorsichtig. Sie können leicht Nebenwirkungen in Ihren .mapFunktionen erzeugen .

Ok, ruhe dich einfach aus, das war die schwierige Frage. Reibungsloses Segeln von hier an raus.

Wählen

.selectermöglicht es Ihnen, ein Element in einem Array zu "finden". Sie müssen .selecteine Funktion angeben, die true oder false zurückgibt, damit sie weiß, ob ein Array-Element „beibehalten“ werden soll oder nicht.

2.3.0 :028 > array = ['hello', 'hi', 'goodbye'] 2.3.0 :029 > array.selectword => ["hello", "goodbye"]

Ein etwas komplexeres Beispiel, das wahrscheinlich näher daran kommt, wie Sie dies tatsächlich verwenden würden. Lassen Sie uns .mapam Ende für ein gutes Maß einwerfen :

2.3.0 :030 > valid_colors = ['red', 'green', 'blue'] 2.3.0 :031 > cars = [{type: 'porsche', color: 'red'}, {type: 'mustang', color: 'orange'}, {type: 'prius', color: 'blue'}] 2.3.0 :032 > cars.select valid_colors.include?(car[:color]) .map  => ["porsche", "prius"]

Ja, Leute, Sie können sich diesen Methoden anschließen, um unvorstellbare Macht auszuüben. Ok, du kannst es dir wahrscheinlich vorstellen, aber es ist immer noch cool.

Noch sauberere Syntax: .map (&: Methode)

Wenn wir mit Autoobjekten und nicht nur mit einem einfachen Hash gearbeitet hätten, hätten wir eine sauberere Syntax verwenden können. Der Kürze halber werde ich ein anderes Beispiel verwenden. Vielleicht bereiten wir diese Liste von Autos für den Versand in einer API vor und müssen JSON generieren. Wir können die .to_jsonMethode verwenden:

# using regular map syntax 2.3.0 :047 > cars.select .map car.to_json => ["{\"type\":\"porsche\",\"color\":\"red\"}", "{\"type\":\"prius\",\"color\":\"blue\"}"] # using the cleaner syntax 2.3.0 :046 > cars.selectcar.map(&:to_json) => ["{\"type\":\"porsche\",\"color\":\"red\"}", "{\"type\":\"prius\",\"color\":\"blue\"}"]

Ablehnen

Ablehnen ist das .selectYang des Yins:

2.3.0 :048 > cars.reject valid_colors.include?(car[:color]) .mapcar => ["mustang"]

Anstatt die gewünschten Array-Elemente auszuwählen , lehnen wir alles ab, was unsere Funktion nicht als wahr zurückgibt. Denken Sie daran, dass die Funktion in unserer Zurückweisung bestimmt, ob das Array-Element zurückgegeben wird oder nicht. Wenn dies der Fall ist, wird das Element zurückgegeben, andernfalls nicht.

Reduzieren

Reduzieren hat eine komplexere Struktur als unsere anderen Array-Methoden, wird jedoch im Allgemeinen für ziemlich einfache Dinge in Ruby verwendet - hauptsächlich für mathematische Dinge. Wir nehmen ein Array und führen dann eine Funktion für jedes Element in diesem Array aus. Dieses Mal kümmern wir uns darum, was von den anderen Array-Elementen zurückgegeben wird . Normalerweise addieren wir eine Reihe von Zahlen:

2.3.0 :049 > array = [1, 2, 3] 2.3.0 :050 > array.reduce => 6

Beachten Sie, dass wir auf die gleiche Weise mit Zeichenfolgen arbeiten können:

2.3.0 :053 > array = ['amber', 'scott', 'erica'] 2.3.0 :054 > array.reduce sum + name => "amberscotterica"

Dies kann hilfreich sein, wenn wir uns eine Reihe von Arbeitsunterlagen ansehen. Wenn wir die Gesamtarbeitszeit addieren müssen oder wenn wir die Summe aller Spenden im letzten Monat herausfinden wollen. Ein letzter Hinweis zu .reduce. Wenn Sie mit etwas anderem als normalen alten Zahlen (oder Zeichenfolgen) arbeiten, müssen Sie einen Startwert als Argument angeben:

array = [{weekday: 'Monday', pay: 123}, {weekday: 'Tuedsay', pay: 244}] array.reduce(0)  => 367 array.reduce(100) sum, day => 467

Es gibt natürlich fortgeschrittenere Verwendungsmöglichkeiten, .reduceaber dies ist genug, um Ihnen den Einstieg zu erleichtern.

Beitreten

Ich werfe .joinals Bonus ein, weil es so verdammt nützlich ist. Lassen Sie uns unsere Autos wieder benutzen:

2.3.0 :061 > cars.map car[:type].join(', ') => "porsche, mustang, prius"

.joinist sehr ähnlich, .reduceaußer dass es eine super saubere Syntax hat. Es wird ein Argument benötigt: eine Zeichenfolge, die zwischen allen Array-Elementen eingefügt wird. .joinErstellt eine lange Zeichenfolge aus dem, was Sie ihm geben, auch wenn Ihr Array aus Nicht-Zeichenfolgen besteht:

2.3.0 :062 > cars.join(', ') => "{:type=>\"porsche\", :color=>\"red\"}, {:type=>\"mustang\", :color=>\"orange\"}, {:type=>\"prius\", :color=>\"blue\"}" 2.3.0 :065 > events.join(', ') => "#, #, #"

Warum nicht einfach alles zusammen werfen?

Lassen Sie uns alle Array-Methoden in diesem Beitrag zusammen verwenden! Zehn Tage Hausarbeit, und es ist zufällig, wie lange jede dauern wird. Wir möchten wissen, wie viel Zeit wir insgesamt für die Hausarbeit aufwenden werden. Dies setzt voraus, dass wir nachlassen und alles ignorieren, was länger als 15 Minuten dauert. Oder verschieben Sie alles, was in weniger als 5 Minuten erledigt werden kann, bis zu einem anderen Tag:

days = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] days.map{|day| day.odd? ? {task: 'dishes', minutes: Random.rand(20)} : {task: 'sweep', minutes: Random.rand(20)}} .select .rejecttask .reduce(0)  sum + task[:minutes]

Meine Antwort ist irrelevant, da Sie unterschiedliche zufällige Minuten für Ihre Aufgaben erhalten. Wenn etwas davon frisch oder verwirrend ist, starten Sie eine Ruby-Konsole und drehen Sie sie.

PS: Das ? :Geschäft .mapheißt a ternary. Es ist nur eine Wenn-Sonst-Aussage. Ich benutze es hier nur, um ausgefallen zu sein und alles in eine Zeile zu bringen. Sie sollten solch ein kompliziertes Ternär in Ihrer eigenen Codebasis vermeiden.

Bis zum nächsten Mal!