Ich muss ein JavaScript-Array überprüfen, um festzustellen, ob es doppelte Werte gibt. Was ist der einfachste Weg, dies zu tun? Ich muss nur herausfinden, was die duplizierten Werte sind - ich brauche ihre Indizes nicht oder wie oft sie dupliziert werden.
Ich weiß, dass ich das Array durchlaufen und alle anderen Werte auf Übereinstimmung prüfen kann, aber es scheint, dass es einen einfacheren Weg geben sollte.
Ähnliche Frage:
javascript
arrays
Scott Saunders
quelle
quelle
Antworten:
Sie können das Array sortieren und dann durchlaufen und dann prüfen, ob der nächste (oder vorherige) Index mit dem aktuellen Index übereinstimmt. Vorausgesetzt, Ihr Sortieralgorithmus ist gut, sollte dieser Wert kleiner als O (n 2 ) sein:
Für den Fall, dass Sie als Funktion für Duplikate zurückkehren sollen. Dies gilt für ähnliche Fälle.
Referenz: https://stackoverflow.com/a/57532964/8119511
quelle
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. Stattdessen sagen sie, nicht zu schreibenj = i + +j
. Zwei verschiedene Dinge IMHO. Ich findei += 1
es verwirrender als das Einfache und Schönei++
:)var sorted_arr = arr.sort()
ist es nutzlos:arr.sort()
mutiert das ursprüngliche Array (was ein Problem für sich ist). Dadurch wird auch ein Element verworfen. (Führen Sie den obigen Code aus. Was passiert mit 9?) Cc @dystroy Eine sauberere Lösung wäreresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Wenn Sie die Duplikate entfernen möchten, versuchen Sie diese großartige Lösung:
Quelle: http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/
quelle
Dies ist meine Antwort aus dem doppelten Thread (!):
Beim Schreiben dieses Eintrags 2014 waren alle Beispiele for-Schleifen oder jQuery. Javascript hat dafür die perfekten Werkzeuge: Sortieren, Zuordnen und Reduzieren.
Suchen Sie nach doppelten Elementen
Mehr funktionale Syntax:
@ Dmytro-Laptin wies darauf hin, dass ein Code-Code entfernt werden muss. Dies ist eine kompaktere Version desselben Codes. Verwenden einiger ES6-Tricks und Funktionen höherer Ordnung:
quelle
Suchen Sie nach doppelten Werten in einem Array
Dies sollte eine der kürzesten Möglichkeiten sein, um doppelte Werte in einem Array zu finden. Wie vom OP ausdrücklich gefordert , werden Duplikate nicht entfernt, sondern gefunden .
Dies erfordert keine Sortierung oder ein Framework von Drittanbietern. Es werden auch keine manuellen Schleifen benötigt. Es funktioniert mit jedem Wert, den indexOf () (oder um es klarer zu sagen : der strenge Vergleichsoperator ) unterstützt.
Aufgrund von redu () und indexOf () benötigt es mindestens IE 9.
quelle
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Sie können diese Funktion hinzufügen oder optimieren und zum Array-Prototyp von Javascript hinzufügen:
quelle
AKTUALISIERT: Im Folgenden wird eine optimierte kombinierte Strategie verwendet. Es optimiert primitive Suchvorgänge, um von der Suchzeit für Hash O (1) zu profitieren (die Ausführung
unique
auf einem Array von Grundelementen ist O (n)). Objektsuchen werden optimiert, indem Objekte beim Durchlaufen mit einer eindeutigen ID versehen werden, sodass die Identifizierung doppelter Objekte auch O (1) pro Element und O (n) für die gesamte Liste beträgt. Die einzige Ausnahme sind Elemente, die eingefroren sind, aber diese sind selten, und ein Fallback wird mithilfe eines Arrays und indexOf bereitgestellt.Wenn Sie über ES6-Sammlungen verfügen, gibt es eine viel einfachere und wesentlich schnellere Version. (Shim für IE9 + und andere Browser hier: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
quelle
AKTUALISIERT: Kurzer Einzeiler , um die Duplikate zu erhalten:
Um das Array ohne Duplikate zu erhalten, kehren Sie einfach die Bedingung um:
Ich habe
filter()
in meiner alten Antwort unten einfach nicht darüber nachgedacht;)Wenn Sie nur überprüfen müssen, ob in dieser Frage keine Duplikate vorhanden sind , können Sie die folgende
every()
Methode verwenden:Beachten Sie, dass
every()
dies für IE 8 und niedriger nicht funktioniert.quelle
quelle
'a'
im Array, innerhalb des Filters Funktion derindex == 1
, währendself.indexOf('a') == 0
Dies sollte Ihnen das bringen, was Sie wollen, nur die Duplikate.
quelle
mit underscore.js
quelle
ES2015
Suchen Sie eindeutige Werte aus 3 Arrays (oder mehr):
Nur eine Polyfüllung für das Array indexOf für alte Browser:
jQuery-Lösung mit "inArray":
anstatt das hinzuzufügen
Array.prototype.indexOf
quelle
var r = [];
damit dein Code funktioniert. Und arbeitete wie Charme.r
VariableHier ist meine einfache und einzeilige Lösung.
Zuerst werden nicht eindeutige Elemente durchsucht, und dann wird das gefundene Array mithilfe von Set eindeutig.
Wir haben also am Ende eine Reihe von Duplikaten.
quelle
Dies ist mein Vorschlag (ES6):
quelle
undefined
ein Duplikat ist.oder wenn es zur prototyp.chain von Array hinzugefügt wird
Siehe hier: https://gist.github.com/1305056
quelle
i&&
gehe auch davon aus, dass dies dazu dient, das Überschreiten der Grenzen des Arrays zu vermeiden, aber es bedeutet auch, dass das erste Element im sortierten Array nicht enthalten ist. In Ihrem Beispiel enthält1
das resultierende Array kein . Dhreturn i&&v!==o[i-1]?v:0;
solltereturn v!==o[i-1];
Schneller und eleganter Weg mit es6 Objekt Destrukturierung und Reduzierung
Es wird in O (n) ausgeführt (1 Iteration über das Array) und wiederholt keine Werte, die mehr als zweimal vorkommen
quelle
Hier ist die einfachste Lösung, die ich mir vorstellen kann:
Das ist es.
Hinweis:
Es funktioniert mit beliebigen Zahlen, einschließlich
0
Zeichenfolgen und negativen Zahlen, z. B.-1
- Verwandte Frage: Alle eindeutigen Werte in einem JavaScript-Array abrufen (Duplikate entfernen)Das ursprüngliche Array
arr
bleibt erhalten (filter
gibt das neue Array zurück, anstatt das Original zu ändern)Das
filtered
Array enthält alle Duplikate. Es kann auch mehr als einen Wert enthalten (z. B. unser gefiltertes Array hier[ 2, 2, 0, 0, -1, 'a', 'a' ]
).Wenn Sie erhalten möchten nur Werte , die doppelt vorhanden sind (Sie müssen nicht mehrere Duplikate mit dem gleichen Wert haben wollen) Sie verwenden können
[...new Set(filtered)]
(ES6 hat ein Objekt Set , die nur eindeutige Werte speichern kann)Hoffe das hilft.
quelle
Kürzeste Vanille JS :
quelle
Hier ist ein sehr leichter und einfacher Weg:
quelle
Mit ES6 (oder mit Babel oder Typescipt) können Sie einfach:
https://es6console.com/j58euhbt/
quelle
Einfacher Code mit ES6-Syntax (sortiertes Array von Duplikaten zurückgeben):
Wie benutzt man:
quelle
Einzeiler
quelle
indx!
das erste Beispiel?indx !== ...
- strikte Ungleichung.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Diese Antwort kann auch hilfreich sein. Sie nutzt den
reduce
Operator / die Methode js , um Duplikate aus dem Array zu entfernen .quelle
new Set([1, 2, 2, 3, 3, 3, 3])
, um Duplikate zu entfernenDie folgende Funktion (eine Variation der bereits erwähnten Funktion eliminDuplicates) scheint den Trick zu tun und gibt test2,1,7,5 für die Eingabe ["test", "test2", "test2", 1, 1, 1, 2 zurück , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Beachten Sie, dass das Problem in JavaScript seltsamer ist als in den meisten anderen Sprachen, da ein JavaScript-Array fast alles enthalten kann. Beachten Sie, dass Lösungen, die Sortieren verwenden, möglicherweise eine geeignete Sortierfunktion bereitstellen müssen. Ich habe diese Route noch nicht ausprobiert.
Diese spezielle Implementierung funktioniert für (mindestens) Zeichenfolgen und Zahlen.
quelle
Nur ES5 (dh es wird eine filter () - Polyfüllung für IE8 und darunter benötigt):
quelle
Diese Funktion vermeidet den Sortierschritt und verwendet die Methode redu (), um Duplikate in ein neues Array zu verschieben, sofern es noch nicht vorhanden ist.
quelle
Dies ist wahrscheinlich einer der schnellsten Wege, um die Duplikate dauerhaft zehnmal schneller aus einem Array zu entfernen als die meisten Funktionen hier. Und 78-mal schneller in Safari
Wenn Sie den obigen Code nicht lesen können, fragen Sie, lesen Sie ein Javascript-Buch oder hier finden Sie einige Erklärungen zu kürzerem Code. https://stackoverflow.com/a/21353032/2450730
BEARBEITEN Wie in den Kommentaren angegeben, gibt diese Funktion ein Array mit Eindeutigkeiten zurück. Die Frage fragt jedoch nach den Duplikaten. In diesem Fall können Sie durch eine einfache Änderung dieser Funktion die Duplikate in ein Array verschieben. Mit der vorherigen Funktion werden
toUnique
die Duplikate der Duplikate entfernt.quelle
Verwenden Sie "Includes", um zu testen, ob das Element bereits vorhanden ist.
quelle
ES6 bietet die Set-Datenstruktur, bei der es sich im Grunde um ein Array handelt, das keine Duplikate akzeptiert. Mit der Set-Datenstruktur gibt es eine sehr einfache Möglichkeit, Duplikate in einem Array zu finden (mit nur einer Schleife).
Hier ist mein Code
quelle
Ich habe gerade einen einfachen Weg gefunden, dies mit einem Array-Filter zu erreichen
quelle
Das Befolgen der Logik wird einfacher und schneller
Vorteile:
Beschreibung der Logik:
Hinweis: Die Methoden map () und filter () sind effizient und schneller.
quelle