I need to write a custom pipe in Angular that takes an array of objects and a variable called order
with a value of either ascending
or descending
as a parameter and then sort the array of objects by a property value.
The data looks something like this:
[
{
"location_type": "KAUPPA",
"postalcode": "100",
"availability": "LIIKETILAN AUKIOLO",
"location": "SUOMALAINEN KIRJAKAUPPA / SISÄKÄYTÄVÄ",
"municipality": "TURKU",
"target_address": "ALEKSANTERINKATU 23",
"availability_details": "",
"coordinates_lon": "24.941095",
"coordinates_lat": "60.168718"
},
{
"location_type": "PANKIN KONTTORI",
"postalcode": "100",
"availability": "ITSEPALVELUALUEEN AUKIOLO",
"location": "NORDEA SENAATINTORI",
"municipality": "VANTAA",
"target_address": "ALEKSANTERINKATU 30",
"availability_details": "ma-su klo 06-22",
"coordinates_lon": "24.950720",
"coordinates_lat": "60.168930"
},
{
"location_type": "TAVARATALO",
"postalcode": "100",
"availability": "LIIKETILAN AUKIOLO",
"location": "STOCKMANN / 8. KERROS",
"municipality": "HELSINKI",
"target_address": "ALEKSANTERINKATU 52",
"availability_details": "",
"coordinates_lon": "24.941870",
"coordinates_lat": "60.168430"
}
]
The objects in the array need to be put into an order by municipality
's value.
As mentioned several times in the Comments and on the above answer by Pardeep as well, using Pipe
to sort the data is not a very good idea.
If you want to sort fields, just implement it on your template and then trigger the sort function only on events. This would significantly save you performance.
Here, give this a try:
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
lastSortedByField;
ascendingOrder = true;
data = [
{
"location_type": "KAUPPA",
"postalcode": "100",
"availability": "LIIKETILAN AUKIOLO",
"location": "SUOMALAINEN KIRJAKAUPPA / SISÄKÄYTÄVÄ",
"municipality": "TURKU",
"target_address": "ALEKSANTERINKATU 23",
"availability_details": "",
"coordinates_lon": "24.941095",
"coordinates_lat": "60.168718"
},
{
"location_type": "PANKIN KONTTORI",
"postalcode": "100",
"availability": "ITSEPALVELUALUEEN AUKIOLO",
"location": "NORDEA SENAATINTORI",
"municipality": "VANTAA",
"target_address": "ALEKSANTERINKATU 30",
"availability_details": "ma-su klo 06-22",
"coordinates_lon": "24.950720",
"coordinates_lat": "60.168930"
},
{
"location_type": "TAVARATALO",
"postalcode": "100",
"availability": "LIIKETILAN AUKIOLO",
"location": "STOCKMANN / 8. KERROS",
"municipality": "HELSINKI",
"target_address": "ALEKSANTERINKATU 52",
"availability_details": "",
"coordinates_lon": "24.941870",
"coordinates_lat": "60.168430"
}
];
sortByField(field) {
if(this.lastSortedByField === field) {
this.ascendingOrder = !this.ascendingOrder;
}
else {
this.lastSortedByField = field;
this.ascendingOrder = true;
}
if(this.ascendingOrder) {
this.data = this.data.sort((a, b) => {
if (a[field] < b[field])
return -1;
if (a[field] > b[field])
return 1;
return 0;
});
} else {
this.data = this.data.sort((a, b) => {
if (a[field] < b[field])
return 1;
if (a[field] > b[field])
return -1;
return 0;
});
}
}
}
And in the Template:
<table border="1">
<thead>
<tr>
<td (click)="sortByField('location_type')">location_type</td>
<td (click)="sortByField('postalcode')">postalcode</td>
<td (click)="sortByField('availability')">availability</td>
<td (click)="sortByField('location')">location</td>
<td (click)="sortByField('municipality')">municipality</td>
<td (click)="sortByField('target_address')">target_address</td>
<td (click)="sortByField('availability_details')">availability_details</td>
<td (click)="sortByField('coordinates_lon')">coordinates_lon</td>
<td (click)="sortByField('coordinates_lat')">coordinates_lat</td>
</tr>
</thead>
<tbody>
<tr *ngFor="let datum of data">
<td>{{ datum.location_type }}</td>
<td>{{ datum.postalcode }}</td>
<td>{{ datum.availability }}</td>
<td>{{ datum.location }}</td>
<td>{{ datum.municipality }}</td>
<td>{{ datum.target_address }}</td>
<td>{{ datum.availability_details }}</td>
<td>{{ datum.coordinates_lon }}</td>
<td>{{ datum.coordinates_lat }}</td>
</tr>
</tbody>
</table>
Here's a Working Sample StackBlitz for your ref.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加