Parfois, ce type d'exigence est rencontré, et vous devez supprimer des éléments en double dans le tableau et en conserver un. La première méthode qui me vient à l'esprit est probablement d'utiliser 2 pour les boucles pour comparer et supprimer des éléments en double. Le code est le suivant:
Méthode 1:
La copie de code est la suivante:
Array.prototype.distinct = function () {
var arr = [],
len = this.length;
pour (var i = 0; i <len; i ++) {
pour (var j = i + 1; j <len; j ++) {
if (this [i] === this [j]) {
j = ++ i;
}
}
arr.push (this [i]);
}
retour arr;
};
Méthode d'utilisation 1 Si vous rencontrez plus de données, vos performances seront bien pires. Ensuite, continuez à voir la méthode suivante.
Méthode 2:
La copie de code est la suivante:
Array.prototype.distinct = function () {
var self = ceci,
arr = self.concat (). Sort (); // Créez un nouveau tableau et triez-le
arr.sort (fonction (a, b) {
if (a === b) {
var n = self.indexof (a); // Obtenir la valeur d'index
self.splice (n, 1);
}
});
retour à soi;
};
La méthode 2 utilise la fonction de rappel personnalisée et utilise également IndexOf, une méthode qui n'est pas prise en charge par IE6 / 7/8. Bien sûr, l'indexof peut être simulé par lui-même, mais le plus gros problème est qu'il existe également une différence entre la méthode de tri d'IE6 / 7/8 et le navigateur standard. Il existe de nombreux pièges dans des fonctions de rappel personnalisées qui utilisent la méthode de tri dans IE6 / 7/8. Le code de la fonction de rappel personnalisée ci-dessus rapportera directement l'erreur "numéro manquant" dans IE6 / 7/8. Si la fonction de rappel renvoie NAN, cette erreur sera signalée, car en théorie, la fonction de rappel de tri ne peut renvoyer que des entiers. Même si la valeur de retour est ignorée, il y a encore d'autres problèmes, et en fin de compte, il n'y a pas trop de problèmes. La méthode 2 ne fonctionnera pas dans IE6 / 7/8.
Du quai du fou, voici son code:
La copie de code est la suivante:
Array.prototype.delRepeat = function () {
var newArray = [];
var provisionalTable = {};
pour (var i = 0, item; (item = this [i])! = null; i ++) {
if (! provisionAttable [item]) {
NewArray.push (article);
provisoireable [item] = true;
}
}
retourner NewArray;
};
La méthode 3 utilise un objet temporaire pour stocker les éléments du tableau. Si vous rencontrez des éléments du tableau en double, il sera ignoré. Cependant, si vous rencontrez le tableau suivant:
La copie de code est la suivante:
var arr = ['Firefox', 1, '1'];
Si le tableau ci-dessus est utilisé dans la méthode 3, il supprime à tort 1 et "1" comme éléments en double, donc une petite modification de la méthode 3 peut être résolue.
Une version modifiée de la méthode 3:
La copie de code est la suivante:
Array.prototype.distinct = function () {
var arr = [],
obj = {},
i = 0,
len = this.length,
résultat;
pour (; i <len; i ++) {
Résultat = this [i];
if (obj [résultat]! == Résultat) {
arr.push (résultat);
obj [résultat] = résultat;
}
}
retour arr;
};
Plus tard, j'ai lu les commentaires à la fin de l'article sur Fools Wharf. Cette méthode est la même que la méthode fournie par Rekey, mais cette méthode a également des bogues. Si vous rencontrez un tel tableau 2B, tout ira bien:
La copie de code est la suivante:
var arr = ['Firefox', 1, '1', 1];
Le tableau ci-dessus est modifié avec la méthode 3 et les 3 derniers éléments ne seront pas supprimés. Cependant, ce type de tableau est un peu extrême. Si vous rencontrez des données avec la même taille littérale et le même nombre de chaînes, vous devez être traité à l'avance pour éviter ce bogue. La méthode d'utilisation d'objets temporaires est légèrement plus rapide que le tri dans les navigateurs standard, et les algorithmes de la méthode de tri doivent également être différents dans chaque navigateur.