Ordenar un array con enteros y letras alfabéticamente en Angular/Typescript
Lo que planeo hacer
Intento ordenar un arreglo así...
- 1
- 2
- 2(a)
- 2(b)
- 2(b) #UnNombreSimple
- 2(b) #NombreConN
- 3
- 4
- 4(a)
- ...
... en Angular2.
Mi Código Actual
Componente
this.streetDetailRef = this.afDatabase.list('data/users/' + this.currentUserID + '/territory/' + this.sStreet.parentKey + '/' + this.sStreet.key + '/houseNumbers/');
this.streetDetailData = this.streetDetailRef.snapshotChanges().map(changes => {
return changes.map(c => ({ key: c.payload.key, ...c.payload.val() })).sort();
});
El bucle en mi opinión
<ion-item-sliding *ngFor="let house of streetDetailData | async | orderBy: 'number':false" #slidingItem>
<strong>{{ house.number }}</strong> ...
'number' en este caso es el número limpio sin letra. Almaceno la letra en una entrada de Firebase separada. Pero seguro sería posible almacenarlos en la misma si fuera necesario.
Información adicional: Estoy usando el ngx-orderBy-pipe de VadimDez: https://github.com/VadimDez/ngx-order-pipe
El resultado actual
Respuesta #1
Esta función debería hacer el truco:
function sortData(array: Array<number | string>): Array<number | string> {
return array.sort((a, b) => a < b ? -1 : 1);
}
Y aquí hay un ejemplo de uso:
const sorted = sortData(['4(a)', 4, 3, '2(b) #NameWithN', '2(b) #AsimpleName']);
sorted // [ '2(b) #AsimpleName', '2(b) #NameWithN', 3, 4, '4(a)' ]
Respuesta #2
ACTUALIZACIÓN: Aunque mi respuesta funciona, la respuesta aceptada es mejor y la adoptaré para usarla en el futuro.
Puedes usar esta función de comparación simple, junto con la función incorporada sort() de Typescript para obtener las respuestas que deseas.
Typescript :
function sortStrings(a: string, b: string) {
a = a.toLowerCase();
b = b.toLowerCase();
return a > b ? 1 : (a < b ? -1 : 0);
}
console.log(['4(a)', '3', '2', '2(b) secondName',
'2(b)firstName','2(b)','2(a)', '4', '1'].sort(sortStrings));
Salida :
[ '1',
'2',
'2(a)',
'2(b)',
'2(b) firstName',
'2(b) secondName',
'3',
'4',
'4(a)' ]
