Scripttip: Doppelte Arrayschlüssel zusammenfassen

Im heutigen Scripttip möchten wir euch zeigen, wie doppelte Schlüssel in einem mehrdimensionalen Array zusammengeasst werden können.

In diesem Beispiel werden die Werte über einen join zusammengefasst, aber dies lässt sich einfach an die eigenen Bedürfnisse anpassen.

[ruby]
doppelteSchluesselArray = [[:b, ‚B1‘], [:d, ‚D2‘], [:a, ‚A1‘], [:a, ‚A2‘], [:a, ‚A3‘], [:d, ‚D1‘], [:c, ‚C1‘]]
Hash[doppelteSchluesselArray.group_by(&:first).map {|k,v| [k,v.map(&:last).join(‚, ‚)]}]
=> {:d=>"D2, D1", :a=>"A1, A2, A3", :b=>"B1", :c=>"C1"}
[/ruby]

Script-Tip: Summe eines Arrays ermitteln

Die Summe eines Arrays lässt sich in auf verschiedenste Art und Weise ermitteln. In unserem heutigen Script-Tip wollen wir euch zeigen, welche Möglichkeiten es gibt.

[ruby]
# Das zu summierende Array
mein_array = [1, 8, 5, 3, 10]

# Die offensichtlichste Methode
sum = 0
mein_array.each { |a| sum+=a }

# Eine etwas kürzere Variante
mein_array.inject{|sum,x| sum + x }

# Wie man mit Ruby 1.9 zum Ziel kommt
mein_array.inject(:+)

# Mit der Hilfe von ActiveSupport
require ‚activesupport‘
mein_array.sum

# Oder man erweitert direkt die Array-Klasse um die benötigte Funktion
class Array
def summe
self.inject{|sum,x| sum + x }
end
end

mein_array.summe
[1,2,3,4].summe

[/ruby]

Script-Tip: Arrays

In unserem heutigen Script-Tip wollen wir euch zeigen wie man Arrays nach zufälliger Reichenfolge mischt, das Element mit dem größten/kleinsten Wert incl Index raussucht und den Durchschnittswert aller Elemente herausfindet.

Als erstes ein Beispiel wie man die Elemente nach zufälliger Reichenfolge mischen kann:

[ruby]
[1,2,3,4,5,6,7,8,9].shuffle
# => [3, 2, 5, 7, 4, 6, 1, 9, 8]

# Bitte beachtet, dass dies erst ab Ruby Version 1.8.7 unterstützt wird.
# Falls ihr noch mit einer älteren Version arbeitet/arbeiten müsst,
# könnt ihr auch auf andere Weise eure Arrays "mischen"

[1,2,3,4,5,6,7,8,9].sort_by{ rand }
# => [4, 7, 9, 6, 1, 5, 3, 8, 2]
[/ruby]

Nun ein Beispiel wie ihr den größten/kleinsten Wert in einem Array inclusive dem Index herausfinden könnt:

[ruby]
# Ruby bringt bereits alles mit um die gesuchten Werte
# zu ermitteln: min und max

# Den größten Wert incl. Index finden…
[7,5,10,9,6,8].each_with_index.max
# => [10, 2]

# Den kleinsten Wert incl. Index finden…
[7,5,10,9,6,8].each_with_index.min
# => [5, 1]
[/ruby]

Als letzter Arry-Script-Tip noch ein paar Beispiele um den Durchschnittswert eines gesamten Arrays herauszufinden:

[ruby]
arr = [9,8,5,2,8,7]
arr.inject(:+).to_f / arr.size # => 6.5

# oder
arr.instance_eval{inject(&:+).to_f / length}

# oder
arr.inject{ |r, x| r + x }.to_f / arr.size

# oder
arr.inject(0.0){ |r, x| r + x } / arr.size

# oder
class Array
def gesamt
inject(0.0) { |erg, el| erg + el }
end

def durchschnitt
gesamt / size
end
end

arr.durchschnitt
[/ruby]

Doppelte Einträge filtern

Heute wollen wir euch eine Möglichkeit vorstellen um Datensätze / Arrayelemente von doppelten Einträgen zu befreien.
Um dies zu ermöglichen wird die Array-Klasse um eine weitere Methode erweitert und kann dann in einer beliebigen Ruby/Rails-App benutzt werden.

Dies ist die Erweiterung die benötigt wird.
[ruby]
require ’set‘

class Array
def uniq_by
seen = Set.new
select{ |x| seen.add?( yield( x ) ) }
end
end
[/ruby]

Danach könnt ihr eure Ergebnisse folgendermaßen filtern:

[ruby]
@uniqueposts = Posts.all.uniq_by { |h| h.body }
[/ruby]