Je tente de créer un élément de tri stable à la fonction JavaScript .sort() par défaut. Je l'ai fonctionnant dans tous les navigateurs, sauf pour IE11 et ci-dessous.Création d'un tri stable pour les problèmes JavaScript dans IE11
Voici le code:
Array.prototype.stableSort = function(cmp) {
cmp = !!cmp ? cmp : (function(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
let stabilizedThis = this.map(function(el, index) { return [el, index]; });
stabilizedThis.sort(function(a, b) {
let order = cmp(a[0], b[0]);
if (order != 0) return order;
return a[1] - b[1];
});
for (let i=0; i<this.length; i++) {
this[i] = stabilizedThis[i][0];
}
return this;
}
Pour référence, le code ci-dessus échoue même quand je ne suis pas réellement en utilisant cette fonctionnalité de tri stable dans mon code. Mon utilisation sera quelque chose comme ceci:
sortedArray.stableSort(function(a,b) {
if (type == "string") {
return a[index]["value"].toString().localeCompare(b[index]["value"].toString());
}
else if (type == "number") {
return a[index]["value"] - b[index]["value"];
}
});
Remarque: pour limiter la question fait, je l'ai découvert que - au minimum, ce code fonctionne dans IE11:
Array.prototype.stableSort = function(cmp) {
cmp = !!cmp ? cmp : (function(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
// everything here was removed for testing
return this;
}
Bien sûr, cela pas de tri (ou de tri stable), mais cela ne provoque pas d'erreur de syntaxe.
Malheureusement, les outils de développement et la console ne me donnent pas une indication du numéro de ligne où la panne est.
Pour référence, je base mon code sur ce que j'ai trouvé à cette link. Ils utilisaient des trucs qui n'étaient pas compatibles avec ES5 (la limite de IE11) donc j'ai dû le changer un peu. Je ne sais pas si j'ai raté quelque chose d'autre avec ça.
Des idées sur ce qui se passe?
Pouvez-vous fournir une donnée réelle à l'origine de la panne? – Dekel
ie11 ne supporte pas ES6, comme 'let'. –
@NinaScholz Merci! Je pense que cela l'a corrigé quand j'ai remplacé 'let' par' var'. Ce qui est assez ennuyeux, c'est que je l'avais fait auparavant et que ça a échoué, mais c'était parce qu'il y avait une autre utilisation ES6 que j'ai fini par enlever. Mais pour une raison quelconque, j'ai ajouté 'let' de retour. Vous pouvez ajouter ceci comme réponse! – KickingLettuce