2
votes

Trier le tableau en cliquant sur l'en-tête du tableau

Je veux trier le tableau dans les deux sens (croissant et décroissant) automatiquement un par un en cliquant sur l'en-tête du tableau

Voici le code que j'utilise

SortLast() {
    this.students.sort(function (a, b) {
      var textA = a.lastName.toUpperCase();
      var textB = b.lastName.toUpperCase();
      if (textA < textB)
        return -1
      else if (textA > textB)
        return 1
      else
        return 0;
    });
  }

Donc, je ne veux pas spécifier l'ordre de tri, il trie automatiquement dans un sens et au-dessus du tableau, les étudiants sont patchés sur la grille en HTML.


0 commentaires

3 Réponses :


0
votes

Essayez ceci, j'espère que cela vous aidera

// asc
this.dataArray.sort(function(a, b){
    if(a.lastName.toString().toLowerCase() < b.lastName.toString().toLowerCase()) { return -1; }
    if(a.lastName.toString().toLowerCase() > b.lastName.toString().toLowerCase()) { return 1; }
});
// des
this.dataArray.sort(function(a, b){
    if(b.lastName.toString().toLowerCase() < a.lastName.toString().toLowerCase()) { return -1; }
    if(b.lastName.toString().toLowerCase() > a.lastName.toString().toLowerCase()) { return 1; }
}

1 commentaires

Lorsque vous cliquez sur la première fois, il trie dans l'ordre décroissant, mais la prochaine fois que vous cliquez dessus, cela ne change rien.



1
votes

Stockez l'état de tri, puis triez simplement asc ou desc en fonction du dernier tri.

null [ { lastName: 'John' }, { lastName: 'Zoe' }, { lastName: 'Ana' } ]
asc [ { lastName: 'Ana' }, { lastName: 'John' }, { lastName: 'Zoe' } ]
desc [ { lastName: 'Zoe' }, { lastName: 'John' }, { lastName: 'Ana' } ]

essayez:

const table = new Table()
console.log(table.sortDir,table.students)
table.sort()
console.log(table.sortDir, table.students)
table.sort()
console.log(table.sortDir, table.students)

résultat:

ASC = "asc"
DESC = "desc"

class Table {

    constructor(){
        this.sortDir = null;
        this.students = [{lastName: "John"}, {lastName: "Zoe"}, {lastName: "Ana"}];
    }

    isAsc(){ return this.sortDir === ASC; }
    isDesc(){ return this.sortDir === DESC; }

    sort() {
        const scope = this;
        this.sortDir = this.isAsc() ? DESC: ASC

        this.students.sort(function (a, b) {
            const textA = scope.isDesc() ? b.lastName.toUpperCase() :  a.lastName.toUpperCase();
            const textB = scope.isDesc() ?  a.lastName.toUpperCase() :  b.lastName.toUpperCase();
            return  (textA < textB) ? -1 : (textA > textB) ? 1 : 0
        });
    }
}


0 commentaires

0
votes
sorting(arr, ascending) {    
    if (typeof (ascending) === "undefined")
      ascending = true;
    var multi = ascending ? 1 : -1;
    var sorter = function (a: { lastName: string; }, b: { lastName: string; }) {
      if (a.lastName === b.lastName)      // identical? return 0
        return 0;
      else if (a.lastName === 0)  // a is null? last 
        return 1;
      else if (b.lastName === 0)  // b is null? last
        return -1;
      else                  // compare, negate if descending
        return a.lastName.toString().localeCompare(b.lastName.toString()) * multi;
    }
    return arr.sort(sorter);
  }
Use this function like 
this.sorting(array[],false); // true for asc, false for desc

0 commentaires