Maison  >  Article  >  interface Web  >  Un exemple d'utilisation incorrecte des astuces JavaScript Sort_javascript

Un exemple d'utilisation incorrecte des astuces JavaScript Sort_javascript

WBOY
WBOYoriginal
2016-05-16 16:08:341062parcourir

Un problème très magique s'est produit dans le code d'un collègue il n'y a pas longtemps. Le processus général consiste à trier un tableau composé d'objets. L'attribut a est utilisé pour le tri, et l'attribut b est utilisé comme condition préférée. égal à 1 Quelle que soit la valeur de a, elle vient en premier. C'est une question très simple, mais le problème est qu'il utilise le tri deux fois pour implémenter le tri cette fois, d'abord en fonction des attributs de a, puis en fonction de la valeur de b. Le problème réside dans le deuxième type.

Nous tenons pour acquis que lors du premier tri, le tableau a été trié du plus grand au plus petit en fonction des attributs de a. Dans le deuxième temps, il suffit de ne pas modifier l'ordre du tableau d'origine (généralement écrit). dans la méthode pour renvoyer 0 ou -1), pensez uniquement à amener les éléments avec b égal à 1 au premier plan. Mais en fait, cela est lié à l'algorithme de tri sélectionné par le langage. La méthode de tri intégrée de JavaScript (et d'autres langages) utilise une collection de plusieurs algorithmes de tri, et parfois elle ne garantit pas que les positions des mêmes éléments. sont cohérents.

Ce qui suit est un exemple trouvé à partir de stackoverflow

Copier le code Le code est le suivant :

var arrayToSort = [
{nom : 'a', force : 1}, {nom : 'b', force : 1}, {nom : 'c', force : 1}, {nom : 'd', force : 1},
{nom : 'e', ​​​​force : 1}, {nom : 'f', force : 1}, {nom : 'g', force : 1}, {nom : 'h', force : 1},
{nom : 'i', force : 1}, {nom : 'j', force : 1}, {nom : 'k', force : 1}, {nom : 'l', force : 1},
{nom : 'm', force : 1}, {nom : 'n', force : 1}, {nom : 'o', force : 1}, {nom : 'p', force : 1},
{nom : 'q', force : 1}, {nom : 'r', force : 1}, {nom : 's', force : 1}, {nom : 't', force : 1}
];

arrayToSort.sort(fonction (a, b) {
Retour b.force - a.force;
});

arrayToSort.forEach(fonction (élément) {
console.log(element.name);
});

Nous pourrions penser que la valeur du dernier élément est toujours comprise entre a et t, mais le résultat réel est dans le désordre. En effet, l'algorithme de tri ne conserve pas l'ordre du tableau d'origine, ce qui est instable.

Ensuite, nous devrions faire de notre mieux pour éviter que cette situation ne se produise. En prenant l'exemple de mon collègue, cela devrait être un moyen réalisable de fusionner la logique de deux tris en un seul. Si elle doit être divisée en plusieurs tris, fusionnez-la. la logique du tableau d'origine L'ordre est enregistré dans les attributs de l'élément.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn