var unique = arr.filter(function(elem, index, self) {
return index === self.indexOf(elem);
})
wie ist das effizient? Die Erklärung der Worst-Case-Laufzeit hängt davon ab, wie indexOf funktioniert, wenn es in linearer Zeit ausgeführt wird, dann ist die Worst-Case-Zeit O (n ^ 2).
– abkds
12. Januar 2016 um 15:52 Uhr
@AbKDs bitte näher darauf eingehen
– Eduardo in Norwegen
31. Juli 2016 um 17:19 Uhr
@MehmetInce es ist überhaupt nicht “effizient”, das läuft in O (n ^ 2)
– Dragos Rizescu
30. März 2017 um 12:24 Uhr
.filter() iteriert über alle Elemente des Arrays und gibt nur diejenigen zurück, für die der Callback wahr zurückgibt. .indexOf() gibt den Index des Elements ganz links im Array zurück. Wenn es doppelte Elemente gibt, werden sie sicher entfernt, wenn ihr Index mit dem ganz linken verglichen wird. Weitere Informationen finden Sie unter developer.mozilla.org/it/docs/Web/JavaScript/Reference/… 🙂 @MadPhysicist
– Niccolò Campolungo
9. Mai 2017 um 21:58 Uhr
Diese Antwort ist jedoch immer noch in Ordnung für sehr kleine Listen. Es hat den Vorteil, dass es sich um einen sehr einfachen Code handelt, der weniger wahrscheinlich Fehler enthält und weniger Leseaufwand erfordert als Code, der einen Hilfsspeicher verwendet. Es ist jedoch weniger flexibel: Es würde nicht funktionieren, wenn Sie Duplikate basierend auf nur einem einzigen Elementfeld in der Liste eliminieren wollten, während die andere Lösung einfach daran anzupassen wäre.
– Arthur Tacca
9. Dezember 2017 um 18:38 Uhr
Denys Séguret
Da die Elemente noch bestellt sind, müssen Sie keine Karte erstellen, es gibt eine schnelle Lösung:
var newarr = [arr[0]];
for (var i=1; i<arr.length; i++) {
if (arr[i]!=arr[i-1]) newarr.push(arr[i]);
}
Wenn Ihr Array nicht sortiert wäre, würden Sie eine Karte verwenden:
var newarr = (function(arr){
var m = {}, newarr = []
for (var i=0; i<arr.length; i++) {
var v = arr[i];
if (!m[v]) {
newarr.push(v);
m[v]=true;
}
}
return newarr;
})(arr);
Beachten Sie, dass dies bei weitem viel schneller ist als die akzeptierte Antwort.
Array ist nicht immer sortiert.
– Mehmet Ince
25. Mai 2013 um 8:37 Uhr
Es ist einfacher als das Machen Sie Ihren Ansatz ein bisschen einfacher var m = []; arr.forEach( v => m[v]=wahr ); var newarr = Object.keys(m); Einfach richtig?
– pPanda_beta
14. August 2017 um 15:06 Uhr
Dies ist eine großartige Antwort. Ich würde jedoch eher ein ES6-Set als ein Objekt verwenden, damit die Elemente in der Liste keine Zeichenfolgen sein müssen. (Offensichtlich war das keine Option, als die Antwort geschrieben wurde.)
– Arthur Tacca
9. Dezember 2017 um 19:24 Uhr
Es ist auch mit ungeordneten Arrays extrem schnell. Vielen Dank!
– Deutsch jr
25. Februar 2021 um 18:48 Uhr
Tolle Antwort! 😉
– Britto
5. September 2021 um 23:43 Uhr
var arr = [1,2,2,3,4,5,5,5,6,7,7,8,9,10,10];
function squash(arr){
var tmp = [];
for(var i = 0; i < arr.length; i++){
if(tmp.indexOf(arr[i]) == -1){
tmp.push(arr[i]);
}
}
return tmp;
}
console.log(squash(arr));
Array.prototype.removeDuplicates = function (){
var temp=new Array();
this.sort();
for(i=0;i<this.length;i++){
if(this[i]==this[i+1]) {continue}
temp[temp.length]=this[i];
}
return temp;
}
Bearbeiten:
Dieser Code muss nicht sortiert werden:
Array.prototype.removeDuplicates = function (){
var temp=new Array();
label:for(i=0;i<this.length;i++){
for(var j=0; j<temp.length;j++ ){//check duplicates
if(temp[j]==this[i])//skip if already present
continue label;
}
temp[temp.length] = this[i];
}
return temp;
}
(Aber kein getesteter Code!)
Diese Funktion entfernt nicht nur Duplikate, sondern sortiert auch. Warum den Prototyp von Array mit einer so spezifischen Funktion belasten (die für keinen Array-Typ funktionieren würde, da die meisten nicht direkt sortiert werden können)?
– Denys Séguret
25. Mai 2013 um 8:37 Uhr
Vielleicht besser auf Ungleichheit testen und entsorgen continue
– Matanya
25. Mai 2013 um 8:41 Uhr
@Matanya Ich verbessere meine Antwort
– Grijesh Chauhan
25. Mai 2013 um 8:42 Uhr
stackoverflow.com/q/9229645/989121
– georg
25. Mai 2013 um 9:37 Uhr
@ thg435 Ich hatte einen einfachen Fehler von { im ersten Code hat es deshalb nicht funktioniert, jetzt korrigiert und getestet.
– Grijesh Chauhan
25. Mai 2013 um 11:30 Uhr
Diese Funktion entfernt nicht nur Duplikate, sondern sortiert auch. Warum den Prototyp von Array mit einer so spezifischen Funktion belasten (die für keinen Array-Typ funktionieren würde, da die meisten nicht direkt sortiert werden können)?
– Denys Séguret
25. Mai 2013 um 8:37 Uhr
Vielleicht besser auf Ungleichheit testen und entsorgen continue
– Matanya
25. Mai 2013 um 8:41 Uhr
@Matanya Ich verbessere meine Antwort
– Grijesh Chauhan
25. Mai 2013 um 8:42 Uhr
stackoverflow.com/q/9229645/989121
– georg
25. Mai 2013 um 9:37 Uhr
@ thg435 Ich hatte einen einfachen Fehler von { im ersten Code hat es deshalb nicht funktioniert, jetzt korrigiert und getestet.
– Grijesh Chauhan
25. Mai 2013 um 11:30 Uhr
11765000cookie-checkLöschen Sie doppelte Elemente aus einem Array [duplicate]yes
Sie könnten das Array durchlaufen und alle Elemente in eine Karte kopieren.
– Devolus
25. Mai 2013 um 8:30 Uhr
@Devolus, das gilt nur für Strings und Zahlen, Sie können kein Objekt oder Array als Indexschlüssel verwenden.
– Umur Kontaci
25. Mai 2013 um 8:31 Uhr
Es ist eine Lösung, aber auch eine Brute-Force-Lösung. Gibt es einen intelligenteren (effizienteren) Weg dafür?
– Mehmet Ince
25. Mai 2013 um 8:31 Uhr
Sortieren Sie das Array, iterieren Sie, verschieben Sie das Element in ein neues Array, wenn es nicht dasselbe wie das letzte ist.
– DarthJDG
25. Mai 2013 um 8:34 Uhr
@Devolus: Aber JavaScript ist nicht wie Java.
– Felix Klinge
25. Mai 2013 um 8:49 Uhr