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: .map
Gibt ein neues modifiziertes Array zurück, während .each
das ursprüngliche Array zurückgegeben wird.
Nebenwirkungen in der Karte
Wenn Sie an funktionale Programmierung gewöhnt sind, .map
scheint Ruby sehr seltsam zu sein. Schauen Sie sich dieses Beispiel an. Ich habe eine einfache Event
Klasse 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 .map
Funktionen erzeugen .
Ok, ruhe dich einfach aus, das war die schwierige Frage. Reibungsloses Segeln von hier an raus.
Wählen
.select
ermöglicht es Ihnen, ein Element in einem Array zu "finden". Sie müssen .select
eine 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 .map
am 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_json
Methode 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 .select
Yang 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, .reduce
aber dies ist genug, um Ihnen den Einstieg zu erleichtern.
Beitreten
Ich werfe .join
als 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"
.join
ist sehr ähnlich, .reduce
außer dass es eine super saubere Syntax hat. Es wird ein Argument benötigt: eine Zeichenfolge, die zwischen allen Array-Elementen eingefügt wird. .join
Erstellt 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 .map
heiß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!