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.
3 Réponses :
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; } }
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.
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
});
}
}
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