0
votes

Problème en utilisant .sort pour trier les éléments par ordre alphabétique

j'ai un problème de tri avec jQuery.Les éléments ne sont pas triés .J'ai utilisé JavaScript, mais cela fonctionne bien avec moi si l'attribut est des chiffres mais pas du texte. Je peux résoudre le problème à l'aide de l'annexe, mais ce n'est pas ce qui est prêt à utiliser. Quelqu'un peut-il vous demander de tirer dessus de ce code.

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="list">
  <div class="listing-item" data-listing-title="a">
    a
  </div>
  <div class="listing-item" data-listing-title="z">
    z
  </div>
  <div class="listing-item" data-listing-title="b">
    b
  </div>
  <div class="listing-item" data-listing-title="c">
    c
  </div>
</div>


3 commentaires

Vérifiez La documentation pour le < code> .sort () rappel. Il doit renvoyer un numéro pour indiquer comment les deux éléments comparés doivent être commandés; Votre rappel renvoie un booléen ( true ou false ), et cela ne fonctionnera pas.


@Pointy avez-vous une suggestion de savoir comment résoudre un tel problème?


Oui, écrivez un comparateur de tri approprié. La chose la plus simple à faire est d'utiliser la chaîne .Localecompare () méthode pour comparer deux chaînes. Il renvoie exactement le type de résultat numérique dont vous avez besoin.


3 Réponses :


0
votes

Vous devez juste retourner un numéro dans la fonction de tri. Retour -1 Si le premier devrait être placé avant la seconde. Donc, Triez le tri croissant

Vous pouvez ajouter plus de conditions. p>

si ($ (A) .Data ("titre-title")> $ (b) .Data ("titre-title")) renvoie 1 code> -> décroissant Si ($ (A) .Data ("titre-title") = $ (b) .Data ("listing-title")) renvoie 0 code> -> pas de tri p>

et mettre dans la liste HTML la liste triée ( gg code> au lieu de divison code>) p>

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="list">
  <div class="listing-item" data-listing-title="a">
    a
  </div>
  <div class="listing-item" data-listing-title="z">
    z
  </div>
  <div class="listing-item" data-listing-title="b">
    b
  </div>
  <div class="listing-item" data-listing-title="c">
    c
  </div>
</div>


0 commentaires


0
votes

Vous n'avez pas besoin de jQuery pour cela, et je pense que le problème est votre fonction de comparaison, quelque chose comme ça, devrait faire le travail pour vous:

//First select the items
const items = document.querySelectorAll('div#list > .listing-item');
//Next, transform this to an array using `from`, then compare
//using `sort`, finally iterate over the sorted array using `forEach`,
//and append element in the sorted array to the `#list`.
//
Array
  .from(items)
  .sort((x,y) => {
    const valueX = x.dataset.listingTitle;
    const valueY = y.dataset.listingTitle;

    if(valueX > valueY) return 1;
    else if(valueX < valueY) return -1;
    else return 0;
  })
  .forEach(element => document.getElementById('list').appendChild(element));


0 commentaires