javascript - angular Sortera siffror med växlingsfunktion
Så vad jag försöker göra här är att sortera siffrorna "2", "20", "3", "30", "21" i korrekt ordning från stigande till fallande, ungefär som en växlingsfunktion.
Men det verkar som om det sorterar från 30 3 21 20 2 och när man klickar på funktionsknappen igen: 2 20 21 3 30 Sortera
Kod :
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
isAscendic = true
fruits: any = ["2", "20", "3", "30", "21", ];
<ul>
<li *ngFor="let fruit of fruits">{{fruit}}
</li>
</ul>
<button (click)="send()">Sort </button>
Svar #1
Du hanterar nummer, inte strängar. Du jämför strängar istället, så du måste först omvandla dem till nummer:
if (+a1 < +a2) {
//^---- note the + on both a1 and a2.
return 1;
}
if (+a1 > +a2) {
return -1;
}
Uppdaterad (fungerande) stackblitz:
https://stackblitz.com/edit/angular-hzfjd7?file=src/app/app.component.ts
En annan möjlig metod är att först kartlägga objekten, och använda den kartlagda arrayen istället.
protected get numericFruits() {
return this.fruits.map(i => Number(i));
}
Använd sedan numericFruits istället för fruits.
Fullständig kod:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
isAscendic = true
fruits: any = ["2", "20", "3", "30", "21", ];
send(){
this.isAscendic?this.ascendic():this.descendic()
}
protected get numericFruits() {
return this.fruits.map(i => Number(i));
}
ascendic(){
this.isAscendic = false;
this.fruits = this.numericFruits.sort((a1,a2) => {
if (a1 < a2) {
return 1;
}
if (a1 > a2) {
return -1;
}
return 0;
});
}
descendic(){
this.isAscendic = true
this.fruits = this.numericFruits.sort((a1,a2) => {
if (a1 > a2) {
return 1;
}
if (a1 < a2) {
return -1;
}
return 0;
});
}
}
Arbetande stackblitz:
https://stackblitz.com/edit/angular-f5ox91?file=src/app/app.component.ts
Svar #2
När du använder strängar kan du konvertera värdena till ett nummer och ta differensen som resultat för sortering.
this.fruits = this.fruits.sort((a, b) => +a - +b); // asc
this.fruits = this.fruits.sort((a, b) => +b - +a); // desc
