Il n'y a pas longtemps, un problème très magique est entré dans le code de mon collègue. Le processus rugueux consiste à trier un tableau composé d'objets, où l'attribut a est utilisé pour trier, et l'attribut B est une condition préférée. Lorsque B est égal à 1, quelle que soit la valeur A, il est classé au début. C'est un problème très simple. Le problème est qu'il utilise le tri deux fois pour implémenter le tri cette fois, d'abord le tri selon l'attribut de A, puis le tri selon la valeur de b. Le problème réside dans le deuxième tri.
Nous prendrons pour acquis que lors du premier tri, le tableau a été trié de grand à petit selon les attributs de a. Dans la deuxième fois, nous n'avons pas besoin de déplacer l'ordre du tableau d'origine (généralement écrit comme retournant 0 ou -1 dans la méthode), et envisagez uniquement de mentionner les éléments avec B égal à 1 à l'avant. Mais en fait, cela est lié à l'algorithme de tri choisi par la langue. La méthode de tri intégrée de JavaScript (et d'autres langues ensemble) utilise une collection de plusieurs algorithmes de tri, et parfois il ne peut pas garantir que la position des mêmes éléments reste cohérente.
Vous trouverez ci-dessous un exemple trouvé à partir de Stackoverflow
La copie de code est la suivante:
var arraytosort = [
{name: 'a', force: 1}, {name: 'b', force: 1}, {name: 'c', force: 1}, {name: 'd', force: 1},
{name: 'e', force: 1}, {name: 'f', force: 1}, {name: 'g', force: 1}, {name: 'h', force: 1},
{nom: 'i', force: 1}, {name: 'j', force: 1}, {name: 'k', force: 1}, {name: 'l', force: 1},
{nom: 'm', force: 1}, {name: 'n', force: 1}, {name: 'o', force: 1}, {name: 'p', force: 1},
{nom: 'q', force: 1}, {name: 'r', force: 1}, {name: 's', force: 1}, {name: 't', force: 1}
]]
arraytosort.sort (fonction (a, b) {
return b.Strength - a.streng;
});
arraytosort.forEach (fonction (élément) {
console.log (élément.name);
});
Nous pensons que la valeur du dernier élément est toujours de A à T, mais le résultat réel est hors service. En effet, l'algorithme de tri ne conserve pas l'ordre du tableau d'origine, c'est-à-dire instable.
Ensuite, nous devrions essayer d'éviter cette situation. Dans l'exemple de mon collègue, la fusion de la logique de deux sortes en une devrait être une manière réalisable. S'il doit être divisé en plusieurs sortes, l'ordre du tableau d'origine est enregistré sur les attributs des éléments.