Wie kann ich eine Liste eindeutiger Werte in einem Array abrufen? Muss ich immer ein zweites Array verwenden oder gibt es etwas Ähnliches wie die Java-Hashmap in JavaScript?
Ich werde verwenden JavaScript und jQuery verwenden . Es können keine zusätzlichen Bibliotheken verwendet werden.
javascript
jquery
Astronaut
quelle
quelle
underscore.js
Bibliothek?list.toSet
Antworten:
Da ich in den Kommentaren zu @ Rockets Antwort darauf eingegangen bin, kann ich auch ein Beispiel angeben, das keine Bibliotheken verwendet. Dies erfordert zwei neue Prototypfunktionen
contains
undunique
Für mehr Zuverlässigkeit können Sie
contains
dasindexOf
Shim von MDN ersetzen und prüfen, ob jedes ElementindexOf
gleich -1: Dokumentation istquelle
~a.indexOf(b) === (a.indexOf(b) == -1)
if (~a.indexOf(b)) ...
ist .if (a.indexOf(b) == -1) ...
Oder für diejenigen, die einen Einzeiler (einfach und funktional) suchen, der mit aktuellen Browsern kompatibel ist :
Update 18-04-2017
Es sieht so aus, als ob 'Array.prototype.includes' jetzt in den neuesten Versionen der Hauptbrowser weit verbreitet ist ( Kompatibilität) ).
Update 29-07-2015:
Es ist geplant, dass Browser eine standardisierte Methode 'Array.prototype.includes' unterstützen, die diese Frage zwar nicht direkt beantwortet. ist oft verwandt.
Verwendung:
Pollyfill ( Browserunterstützung , Quelle von Mozilla ):
quelle
Hier ist eine viel sauberere Lösung für ES6, die hier nicht enthalten ist. Es verwendet den Operator Set und den Spread-Operator :
...
Welches kehrt zurück
[1, 2]
quelle
Array.from(... new Set(a))
da Set nicht implizit in einen Array-Typ konvertiert werden kann. Nur ein Kopf hoch!Array.from(new Set(a))
? Das scheint zu funktionieren.Ein Liner, reines JavaScript
Mit ES6-Syntax
list = list.filter((x, i, a) => a.indexOf(x) === i)
Mit ES5-Syntax
Browserkompatibilität : IE9 +
quelle
a.indexOf(x) === i
der drei Gleichheitszeichen zu verschärfen .Mit EcmaScript 2016 können Sie es einfach so machen.
Sets sind immer eindeutig und werden verwendet
Array.from()
Sie ein Set in ein Array konvertieren. Schauen Sie sich als Referenz die Dokumentationen an.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Einstellen
quelle
indexOf()
Antworten sind schrecklich, weil sie O (N ^ 2) sind. Die verteilten Antworten sind in Ordnung, funktionieren jedoch nicht für große Arrays. Dies ist der beste Ansatz.Jetzt können wir in ES6 die neu eingeführte ES6-Funktion verwenden
ODER durch Array-Spread-Syntax für Iterables
Es wird das eindeutige Ergebnis zurückgegeben.
quelle
new Set
dies unterstützt (z. B. modernes Angular / TypeScript)let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2];
let uniqueItems = [...new Set(items)];
Wenn Sie das ursprüngliche Array intakt lassen möchten,
Sie benötigen ein zweites Array, um die einzigartigen Elemente des ersten zu enthalten.
Die meisten Browser haben
Array.prototype.filter
:quelle
Heutzutage können Sie den Datentyp Set von ES6 verwenden, um Ihr Array in ein eindeutiges Set zu konvertieren. Wenn Sie dann Array-Methoden verwenden müssen, können Sie diese wieder in ein Array umwandeln:
quelle
var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Nicht in Javascript nativ, aber viele Bibliotheken haben diese Methode.
Underscore.js
_.uniq(array)
( Link ) funktioniert ganz gut ( Quelle ).quelle
Mit jQuery habe ich folgende Array-Funktion erstellt:
quelle
$.uniqueArray(arr)
. Das Einbetten von Verweisen auf jQuery inArray
den Prototyp erscheint fraglich$.uniqueArray
von jQuery abhängt. weniger offensichtlichArray.prototype.unique
ist das auch.prototype
s zu erweitern. Aber ich verstehe jetzt Ihren Standpunkt. Ich werde das trotzdem hier lassen.Kurze und süße Lösung mit zweitem Array;
quelle
Schnell, kompakt, keine verschachtelten Schleifen, funktioniert mit jedem Objekt, nicht nur mit Zeichenfolgen und Zahlen, benötigt ein Prädikat und nur 5 Codezeilen !!
Beispiel: So finden Sie eindeutige Elemente nach Typ:
Wenn Sie möchten, dass das erste eindeutige Element anstelle des letzten gefunden wird, fügen Sie dort ein found.hasOwnPropery () hinzu.
quelle
Sie benötigen nur Vanilla JS, um Unikate mit Array.some und Array.reduce zu finden. Mit der ES2015-Syntax sind es nur 62 Zeichen.
Array.some und Array.reduce werden in IE9 + und anderen Browsern unterstützt. Ändern Sie einfach die Fettpfeilfunktionen für reguläre Funktionen, um sie in Browsern zu unterstützen, die die ES2015-Syntax nicht unterstützen.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects / Array / Reduzieren
quelle
Die meisten der oben genannten Lösungen weisen eine hohe Laufzeitkomplexität auf.
Hier ist die Lösung,
reduce
die die Arbeit verwendet und erledigen kann O (n) Zeit .Hinweis:
Diese Lösung ist nicht abhängig von reduzieren. Die Idee ist, eine Objektzuordnung zu erstellen und eindeutige Objekte in das Array zu verschieben.
quelle
ES6 Weg:
quelle
Sie können verwenden,
es wird Ihnen einzigartige Elemente geben,
**> aber es gibt einen Haken,
Die zweite Option ist die Verwendung der Filtermethode für das Array.
quelle
Sie können ein Array mit Duplikaten eingeben. Die folgende Methode gibt ein Array mit eindeutigen Elementen zurück.
quelle
Das einzige Problem mit den bisher gegebenen Lösungen ist die Effizienz. Wenn Sie sich darüber Sorgen machen (und dies wahrscheinlich auch tun sollten), müssen Sie verschachtelte Schleifen vermeiden: Für * for, filter * indexOf, grep * inArray durchlaufen alle das Array mehrmals. Sie können eine einzelne Schleife mit Lösungen wie dieser oder dieser implementieren
quelle
quelle
Ich habe dieses Problem in reinem JS ausprobiert. Ich habe die folgenden Schritte ausgeführt: 1. Sortieren Sie das angegebene Array, 2. Durchlaufen Sie das sortierte Array, 3. Überprüfen Sie den vorherigen und den nächsten Wert mit dem aktuellen Wert
Demo
quelle
quelle
Wenn Sie bedenken, dass
indexOf
das erste Auftreten eines Elements zurückgegeben wird, können Sie Folgendes tun:quelle
Wenn Sie sich nicht so viele Gedanken über ältere Browser machen müssen, ist dies genau das, wofür Sets entwickelt wurden.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
quelle
Ein anderer Gedanke an diese Frage. Folgendes habe ich getan, um dies mit weniger Code zu erreichen.
quelle
quelle
Hier ist ein Ansatz mit anpassbarer
equals
Funktion, der sowohl für Grundelemente als auch für benutzerdefinierte Objekte verwendet werden kann:Verwendung:
quelle
Meine Antwort verwendet
Array.filter
undArray.indexOf
Methoden, um die eindeutigen Werte zu erhaltenIch habe diesen Ansatz auf einer Website gesehen, aber ihr Code ist anders als hier. Ich habe den Code auf eine Zeile vereinfacht und hier veröffentlicht, damit jemand davon profitiert
Hinweis: Mein Ansatz ähnelt dem von Josh. Ich lasse es hier, da die Variablennamen in meinem Code selbsterklärend sind.
quelle
Ich dachte nur, ob wir die lineare Suche verwenden können, um die Duplikate zu beseitigen:
}}
HTML:
quelle
Hier ist die Einzeiler-Lösung für das Problem:
Kopieren, in die Browserkonsole einfügen und die Ergebnisse erhalten, yo :-)
quelle
Ich habe JQuery Unique Funktion eingebaut .
Weitere Informationen finden Sie in den jquery API-Dokumentationen.
http://api.jquery.com/jquery.unique/
quelle