Wie uniq ein array mit groß-und Kleinschreibung
Soweit ich weiß, ist das Ergebnis von
["a", "A"].uniq
ist
["a", "A"]
Meine Frage ist:
Wie kann ich machen, ["a", "a"].uniq mir entweder ["a"] oder ["A"]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur der Fall konsistente ersten.
e.g:
Edit: Wenn mikej schlägt vor, die Elemente zurückgegeben werden müssen, genau das gleiche wie im ursprünglichen array an, dann wird dies für Sie tun:
Edit2 Lösung, die befriedigen soll mikej 🙂
Es ist ein weiterer Weg, die Sie dies tun können. Sie können tatsächlich an einen block zu
uniq
oderuniq!
können verwendet werden, um eine Bewertung pro element.oder
In diesem Fall, obwohl, alles wird groß-und Kleinschreibung, so dass es immer wieder das array
["A"]
["A", "a"].uniq(&:downcase)
.können Sie erstellen ein mapping (Hash), die zwischen der Fall-normalisiert (z.B. downcased) Werten und den tatsächlichen Wert und nehmen dann nur die Werte aus dem hash:
wählt das Letzte vorkommen eines bestimmten Wortes (groß-und Kleinschreibung):
wenn Sie möchten, dass das erste vorkommen:
oder
Wenn Sie mit ActiveSupport, die Sie verwenden können, uniq_by.
Es wirkt sich nicht auf den Fall der endgültigen Ausgabe.
Etwas effizienter und Weise zu machen, ist die Verwendung von uniq Schlüsseln in hashes, so überprüfen Sie dies:
wird wieder das Letzte element, in diesem Fall
in der Erwägung, dass mit ||= als assign-operator:
zurück zum ersten element, in diesem Fall
vor allem für große Arrays sollte dies schneller sein als wir nicht suchen das array jedes mal mit gehören?
cheers...
Einer allgemeineren Lösung (wenn auch nicht die effizienteste):
Den
uniq_by
Methode benötigt einen lambda-Ausdruck, der prüft die Gleichheit, und einen lambda-Ausdruck, liefert einen hash, und entfernt doppelte Objekte, definiert durch die Daten.Umgesetzt, on top of, die
uniq_ci
Methode entfernt die string-Duplikate mit der groß-und Kleinschreibung Vergleiche.