So erstellen Sie eine Liste der einzigartigen Elemente in JavaScript?
In meinem CouchDB-reduzieren-Funktion, die ich brauche zu reduzieren, eine Liste der Elemente, die das einzigartige lieben.
Hinweis: In diesem Fall ist es ok, um eine Liste, wird es eine kleine Anzahl von Elementen des Typs string.
Mein Aktueller Weg ist, um Schlüssel von einem Objekt, dann wieder der Schlüssel des Objekts
da der Ort den code nicht verwenden kann, Dinge wie _.uniq
zum Beispiel.
Möchte ich finden, eine elegantere Art und Weise zu buchstabieren als diese.
function(keys, values, rereduce) {
//values is a Array of Arrays
values = Array.concat.apply(null, values);
var uniq = {};
values.forEach(function(item) { uniq[item] = true; });
return Object.keys(uniq);
}
- je nachdem, was Sie definieren als elegant, Sie könnten Suche die Quelle der Unterstrich ist einzigartig auf github
- Unterstrich ist teurer für die Zeichenfolge nur und weniger elegant, durch dass Arbeit im Allgemeinen Fall
- Sie benötigen eine Funktion reduzieren? Wenn Sie nur die einzigartigen Werte, die Sie verwenden können, die
group=true
option bei der Beantragung der Ansicht. Weitere Infos finden Sie unter CouchDB-Wiki - eine map-Ansicht nicht verwenden, Gruppe
- Mögliche Duplikate von [Get alle eindeutigen Werte in einem array (entfernen Sie Duplikate) stackoverflow.com/questions/1960473/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Allgemein, die Methode, die Sie verwendet, ist eine gute Idee.
Aber ich konnte mir eine Lösung vorschlagen, die der Algorithmus viel schneller.
Wie Sie sehen, wir haben nur eine Schleife hier.
Ich habe eine Beispiel, die testet Ihre und meine Lösungen. Versuchen Sie, mit ihm zu spielen.
for(var i=0; i<arr.length; ++i)
würde es erzählen die array-Länge auf jeder Schleife? Oder warum erstellen Sie eine separatel
variable?unique([{}, {a:1}]) === [{}]
— denn Sie können nur strings als Objekt-Schlüssel. Ebenso:unique(['1', 1]) === ['1']
Set
undMap
die Sie zum speichern von Objekten wie Schlüssel, siehe meine Antwort. Es ist möglich, dass der hashCode eines Objekts ist ein string, der gespeichert ist, als ein Schlüssel, nicht sicher.Eine alternative, die geeignet ist für kleine Listen wäre die ape die Unix-command-line-Ansatz von
sort | uniq
:Diese Funktion sortiert das argument, und dann filtert das Ergebnis auslassen Elemente, die gleich sind, um Ihre Vorgänger.
Die Schlüssel-basierten Ansatz ist gut, und haben eine bessere performance-Eigenschaften für eine große Anzahl von Elementen (O(n) für das einfügen von n Elemente in einer Hashtabelle, im Gegensatz zu O(n log n) zum Sortieren der Arrays). Dies ist jedoch unwahrscheinlich, um zu erkennen, auf kleinen Listen. Außerdem, mit dieser version könnte man es ändern, um eine andere Sortierung oder die Gleichheit der Funktion, falls notwendig; mit hash-Schlüssel sind Sie stecken mit JavaScripts Vorstellung der wichtigsten Geschlechter.
Die beste Methode zu sein scheinen mit ES6 und Eingestellt. Single line und schneller* als die oben nach fiddle
JS:
*getestet in safari
new Set([1,2,4,6])
weniger hässlich imoArray.from(new Set([1,2,4,6]))
, siehe meine AntwortSollte diese Arbeit mit etwas, nicht nur strings:
die oben erwähnt sind, können nur reduziert werden:
🙂
Mit Dem Objekt.- Tasten geben Sie die Saiten, wenn Sie in integer-Argumente (uniq([1,2,3]) => ['1','2','3']. Hier ist man mit Array.reduzieren:
Dies ist eine alte Frage, ich weiß. Es ist jedoch an der Spitze einer google-Suche, also ich wollte noch hinzufügen, dass können Sie kombinieren die Antworten von @RobHague und @EugeneNaydenov mit den folgenden:
Können Sie ignorieren auch undefined Werte (oft hilfreich), indem Sie:
Spielen kann man mit dieser Lösung hier: https://jsfiddle.net/s8d14v5n/
new Set
für mehr Spaßwas