nodejs - TypeScript clasificando una matriz
typescript version (5)
He estado tratando de resolver un problema muy extraño que encontré con mecanografiado. Trataba una expresión booleana en línea como cualquiera que fuera el primer tipo de valor en lugar de la expresión completa.
Entonces, si intentas algo simple como el siguiente:
var numericArray:Array<number> = [2,3,4,1,5,8,11];
var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);
Obtendrá un error en su método de clasificación indicando que los parámetros no coinciden con ninguna firma del objetivo de la llamada, porque su resultado es numérico y no booleano. Sin embargo, creo que me estoy perdiendo algo porque estoy bastante seguro de que n1> n2 es una afirmación booleana.
Cómo ordenar matriz mixta (alfabetos + números)
// Array of Objects
builds = [
{ id: 1, name: ''Build 91''},
{ id: 2, name: ''Build 32'' },
{ id: 3, name: ''Build 13'' },
{ id: 4, name: ''Build 24'' },
{ id: 5, name: ''Build 5'' },
{ id: 6, name: ''Build 56'' }
]
// objects are being sorted in ASCENDING order
sortedBuilds = builds.sort((n1, n2) => {
return this.naturalCompare(n1.name, n2.name)
})
// if DESCENDING order is required then, use sort().reverse()
// result would be
// { id: 5, name: ''Build 5'' },
// { id: 3, name: ''Build 13'' },
// { id: 4, name: ''Build 24'' },
// { id: 2, name: ''Build 32'' },
// { id: 6, name: ''Build 56'' },
// { id: 1, name: ''Build 91''},
naturalCompare(a, b) {
var ax = [], bx = [];
a.replace(/(/d+)|(/D+)/g, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
b.replace(/(/d+)|(/D+)/g, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
while (ax.length && bx.length) {
var an = ax.shift();
var bn = bx.shift();
var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
if (nn) return nn;
}
return ax.length - bx.length;
}
Al ordenar números, puede usar la comparación compacta:
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);
es decir -
lugar de <
.
Si está comparando algo más, deberá convertir la comparación en un número.
var stringArray: string[] = [''AB'', ''Z'', ''A'', ''AC''];
var sortedArray: string[] = stringArray.sort((n1,n2) => {
if (n1 > n2) {
return 1;
}
if (n1 < n2) {
return -1;
}
return 0;
});
El error es completamente correcto.
Como está tratando de decirte, .sort()
toma una función que devuelve número, no booleano.
Debe devolver negativo si el primer elemento es más pequeño; positivo si es más grande, o cero si son iguales.
Gran respuesta Sohnee. Me gustaría añadir que si tiene una matriz de objetos y desea clasificar por clave, entonces es casi lo mismo, este es un ejemplo de uno que puede ordenar por fecha (número) o título (cadena):
if (sortBy === ''date'') {
return n1.date - n2.date
} else {
if (n1.title > n2.title) {
return 1;
}
if (n1.title < n2.title) {
return -1;
}
return 0;
}
También podría hacer que los valores estén dentro como variables n1 [campo] vs n2 [campo] si es más dinámico, simplemente mantenga la diferencia entre cadenas y números.
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
var sortFn = (n1 , n2) => number { return n1 - n2; }
var sortedArray: number[] = numericArray.sort(sortFn);