JavaScript doppelte Werte in einem Array?

5 Antworten

Um doppelte Werte in einem Array zu finden, kannst du die Filter-Funktion nutzen.

var x = [1,1,4,5,6,3,4,2,1,3,4,5,2];

function findDuplicates(value, index, self)
{
    return self.indexOf(value) != index;
}

var duplicates = x.filter(findDuplicates);
// [1, 4, 1, 3, 4, 5, 2]

Sollen die Werte unique ausgegeben werden, kann ein weiterer Filter auf das duplicates-Array angewandt werden.

function uniqueArray(value, index, self) 
{ 
    return self.indexOf(value) === index;
}

var unique = duplicates.filter(uniqueArray);

// [1, 4, 3, 5, 2]

Natürlich kann das Ergebnis wahlweise auch noch sortiert werden.

var sorted = unique.sort();
// [1, 2, 3, 4, 5]

Das Ganze kann man natürlich auch per Chaining kombinieren:

var duplicates = x.filter(findDuplicates).filter(uniqueArray).sort();
// [1, 2, 3, 4, 5]

Wenn du den uniqueArray-Filter direkt auf x anwendest erhälst du stattdessen ein gefiltertes Array, in dem alle Duplikate entfernt wurden.

var result = x.filter(uniqueArray).sort();
//[1, 2, 3, 4, 5, 6]

Pseudocode:

Neues Array "y" anlegen
für alle Elemente "e" in x
  falls e in Anfang von x enthalten
e an y anhängen
Array y ausgeben

JavaScript: (ohne Gewähr - müsste es ausprobieren)

function ermittleDubletten(x) {
var y = [];
for (var i = 0; i < x.length; i++) {
var e = x[i];
for (j = 0; j < i; j++) { // alle Elemente, die echt vor Index i liegen, durchgehen
if (x[j] = e) {
y.push(e); // push() als append() "missbrauchen"
break; // innerste Schleife verlassen (hier for j)
};
};
};
return y;
}

forEach finde ich in JavaScript etwas unübersichtlich, wenn es auch konziseren Code ermöglicht. Besonders "Lambda-Ausdrücke" als Argumente für forEach machen eine spätere Code-Analyse "spannend".

Woher ich das weiß:Berufserfahrung – Software-Entwickler
ceevee  01.05.2017, 20:49

Was mir spontan auffällt:

  • if (x[j] = e) { ist eine Zuweisung. Da müsste eigentlich "===" hin. "==" ist mMn. ein Bad Practice, das in diesem Fall auch funktionieren würde. "=" ist falsch.
  • Warum musst du "push" als "append" missbrauchen? Die Methode heißt doch eh "push", ein "append" gibt es im JS-Standard nicht.
  • Warum schließt du all deine ifs und Schleifen mit Semikolons ab?
  • In der for-Schleife fehlt das "var". Das bedeutet, dass j im globalen Scope angeklebt wird und so hat man dann überall in seinem JavaScript eine Variable "j". Bzw. im ES5-strict-Mode würde ein Fehler fliegen. Eine dieser Kleinigkeiten, die JS so'n bisschen hassenswert machen. ;)
  • Deine Funktion würde selbst Duplikate zurückgeben, wenn man das Array [3, 3, 3] reingibt, dann kriegt man wahrscheinlich [3, 3, 3] zurück.
3

Kenne mich mit JavaScript nicht aus, aber wird wohl nicht viel anders sein als in anderen Programmiersprachen.

Du nimmst den ersten Wert und gehst den Rest des Arrays durch. Wenn du den Wert nochmal findest, schreibst du die in ein neues Array/eine List, das/die du später zurückgibst. Dann gehst du weiter zum zweiten Wert und gleichst den mit jeder anderen Zahl im Array ab und so weiter. Letztlich sind es also zwei ineinander geschachtelte for-Schleifen.

Da GF diesen Code hier absolut nicht haben will, hier meine Implementierung bei PasteBin:

https://pastebin.com/R2gPnNxc

In dem Array a2 hast du dann alle Werte, die mehr als einmal vorkommen drin.

Woher ich das weiß:Berufserfahrung – Entwickle Webseiten seit über 25 Jahren.
function unique(array) {
var sortedArray = array.sort();
var uniqueArray = [];
sortedArray.forEach(function(current, index) {
var next = sortedArray[index + 1];
if (current === next && unique.indexOf(current) < 0) {
uniqueArray.push(current);
}
});
return uniqueArray;
}

Frag nach, wenn daran irgendwas unklar ist.