Manchmal wird diese Art von Anforderungen angetroffen, und Sie müssen doppelte Elemente im Array löschen und nur eine aufbewahren. Die erste Methode, die in den Sinn kommt, besteht wahrscheinlich darin, 2 für Schleifen zum Vergleich und Entfernen von doppelten Elementen zu verwenden. Der Code ist wie folgt:
Methode 1:
Die Codekopie lautet wie folgt:
Array.prototype.distinct = function () {
var arr = [],
len = this.länge;
für (var i = 0; i <len; i ++) {
für (var j = i+1; j <len; j ++) {
if (this [i] === this [j]) {
J = ++ i;
}
}
arr.push (this [i]);
}
arr zurückgeben;
};
Verwendungsmethode 1 Wenn Sie auf mehr Daten stoßen, wird Ihre Leistung viel schlechter. Anschließend sehen Sie bitte die folgende Methode.
Methode 2:
Die Codekopie lautet wie folgt:
Array.prototype.distinct = function () {
var self = this,,
arr = self.concat (). sort (); // Erstellen Sie ein neues Array und sortieren Sie es
arr.sort (Funktion (a, b) {
if (a === b) {
var n = self.indexof (a); // Indexwert abrufen
self.splice (n, 1);
}
});
Rückkehr selbst;
};
Methode 2 verwendet die benutzerdefinierte Rückruffunktion der Sortierung und auch Indexof, eine Methode, die nicht von IE6/7/8 unterstützt wird. Natürlich kann indexof selbst simuliert werden, aber das größere Problem besteht darin, dass es auch einen Unterschied zwischen der Sortiermethode von IE6/7/8 und dem Standardbrowser gibt. Es gibt viele Fallen in benutzerdefinierten Rückruffunktionen, die die Sortiermethode in IE6/7/8 verwenden. Der Code der obigen benutzerdefinierten Sortier -Rückruffunktion meldet direkt den Fehler "Fehlender Nummer" in IE6/7/8. Wenn die Rückruffunktion NAN zurückgibt, wird dieser Fehler gemeldet, da die Sortier -Rückruffunktion theoretisch nur Ganzzahlen zurückgeben kann. Auch wenn der Rückgabewert ignoriert wird, gibt es noch andere Probleme, und am Ende gibt es keine zu viel Probleme. Methode 2 funktioniert nicht in IE6/7/8.
Aus dem Fool's Wharf ist hier sein Code:
Die Codekopie lautet wie folgt:
Array.prototype.delrepeat = function () {
var newarray = [];
var provisionAltable = {};
für (var i = 0, item; (item = this [i])! = null; i ++) {
if (! provisionAltable [item]) {
newarray.push (item);
provisionAltable [item] = true;
}
}
Rückkehr Newarray;
};
Methode 3 verwendet ein temporäres Objekt, um die Elemente des Arrays zu speichern. Wenn Sie doppelte Array -Elemente begegnen, wird dies ignoriert. Wenn Sie jedoch auf das folgende Array stoßen:
Die Codekopie lautet wie folgt:
var arr = ['firefox', 1, '1'];
Wenn das obige Array in Methode 3 verwendet wird, löscht es fälschlicherweise 1 und "1" als doppelte Elemente, sodass eine kleine Änderung der Methode 3 gelöst werden kann.
Eine modifizierte Version von Methode 3:
Die Codekopie lautet wie folgt:
Array.prototype.distinct = function () {
var arr = [],
obj = {},
i = 0,
len = this.länge,
Ergebnis;
für (; i <len; i ++) {
result = this [i];
if (obj [result]! == result) {
arr.push (Ergebnis);
OBJ [Ergebnis] = Ergebnis;
}
}
arr zurückgeben;
};
Später las ich die Kommentare am Ende des Artikels über Fools Wharf. Diese Methode entspricht der von Rekey bereitgestellten Methode, aber diese Methode hat auch Fehler. Wenn Sie auf ein solches 2B -Array stoßen, wird es Ihnen gut gehen:
Die Codekopie lautet wie folgt:
var arr = ['firefox', 1, '1', 1];
Das obige Array wird mit der Methode 3 geändert und die letzten 3 Elemente werden nicht gelöscht. Diese Art von Array ist jedoch etwas extrem. Wenn Sie Daten mit der gleichen wörtlichen Größe und Anzahl der Zeichenfolgen treffen, sollten Sie im Voraus verarbeitet werden, um diesen Fehler zu vermeiden. Die Methode zur Verwendung temporärer Objekte ist etwas schneller als in Standardbrowsern, und die Algorithmen der Sortiermethode sollten auch in jedem Browser unterschiedlich sein.