Löschen Sie doppelte Elemente aus einem Array [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Mehmet Ince

Zum Beispiel habe ich ein Array wie dieses;

var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]

Mein Zweck ist es, sich wiederholende Elemente aus dem Array zu verwerfen und das endgültige Array wie folgt zu erhalten.

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Wie kann dies in JavaScript erreicht werden?

HINWEIS: Array ist nicht sortiert, Werte können in beliebiger Reihenfolge sein.

  • 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

Benutzer-Avatar
Niccolò Campolungo

Es ist einfacher zu verwenden Array.filter:

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

Benutzer-Avatar
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));

Arbeitsbeispiel http://jsfiddle.net/7Utn7/

Kompatibilität für indexOf auf alten Browsern

Sie können dies mit jquery versuchen

 var arr = [1,2,2,3,4,5,5,5,6,7,7,8,9,10,10];
    var uniqueVals = [];
    $.each(arr, function(i, el){
        if($.inArray(el, uniqueVals) === -1) uniqueVals.push(el);
    });

Benutzer-Avatar
Grijesh Chauhan

Versuchen Sie folgendes von Entfernen von Duplikaten aus einem Array (einfach):

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


1176500cookie-checkLöschen Sie doppelte Elemente aus einem Array [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy