2

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?

+1

Pouvez-vous fournir une donnée réelle à l'origine de la panne? – Dekel

+2

ie11 ne supporte pas ES6, comme 'let'. –

+0

@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

Répondre

3

Microsoft IE11 ne prend pas en charge ES6, comme let instructions. Vous pouvez le remplacer par var instructions.

Array.prototype.stableSort = function (cmp) { 
    cmp = cmp ||function (a, b) { 
     if (a < b) return -1; 
     if (a > b) return 1; 
     return 0; 
    }; 

    var stabilizedThis = this.map(function (el, index) { return [el, index]; }); 

    stabilizedThis.sort(function (a, b) { 
     return cmp(a[0], b[0]) || a[1] - b[1]; 
    }); 

    for (var i = 0; i < this.length; i++) { 
     this[i] = stabilizedThis[i][0]; 
    } 
    return this; 
}