2017-01-30 3 views
1

Nehmen wir an, ich habe eine Liste von E-Mails in einem Array, sagen wir ~ 2000 E-Mails.Ruby on Rails-Aktion für alle Objekte in einem Array?

emails = ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"] 

Angenommen, ich möchte theoretisch die E-Mail-Site-Name erhalten. Also ich möchte emails.each do |email| puts email.split("@")[1]

tun, die mir jeden der Site-Namen für die E-Mails bekommen würde. Aber ich bin neugierig, gibt es einen schnelleren Weg, das aus dem Array zu bekommen?

Idealerweise möchte ich eine array.uniq erstellen, die eine eindeutige Liste aller Websites enthält, die mit den E-Mails verknüpft sind. Ich könnte das manuell tun, aber ich frage mich, ob es eine schnellere Möglichkeit gibt, dies auf dem Array selbst zu tun (das Array, das ich tatsächlich habe, ist ~ 2 Millionen E-Mails lang).

Antwort

4

Was Sie erstellen, ist nicht wirklich ein Array, das sich um Ordnung kümmert und sich nicht um Einzigartigkeit kümmert. Sie möchten eine Set, die sich nicht um die Reihenfolge kümmert, aber keine Duplikate erlaubt.

require 'set' 

email_domains = Set.new 
emails.each do |email| 
    email_domains.add email.split('@', 2).last 
end 
+0

Brilliant Sir! Das wird großartig funktionieren –

1

Ich ziehe diese Lösung

emails.map { |email| email.split('@').last }.uniq 

Aktualisiert

Oder diese

emails.collect { |email| email.split('@').last }.uniq