Tengo una tabla en mi aplicación de reacción y obtiene sus datos de la API.
Quiero ordenar una de sus columnas. a[obj1][obj2] o b[obj1][obj2] Por lo general, es una cadena de números y, a veces, son iguales a "-" (Dash) Esta es mi función de clasificación:
if (order === "DEF") { const sorted = props.currency.sort((a, b) => Number(a[obj1][obj2]) > Number(b[obj1][obj2]) ? 1 : Number(b[obj1][obj2]) > Number(a[obj1][obj2]) || a[obj1][obj2] === "-" ? -1 : 0 ); props.setCurrency(sorted); setOrder("ASC"); } else if (order === "ASC") { const sorted = props.currency.sort((a, b) => Number(a[obj1][obj2]) < Number(b[obj1][obj2]) || a[obj1][obj2] === "-" ? 1 : Number(b[obj1][obj2]) < Number(a[obj1][obj2]) ? -1 : 0 ); props.setCurrency(sorted); setOrder("DSC"); } else { const sorted = defaultCurrency; props.setCurrency(sorted); setOrder("DEF"); } Después de llamar a la clasificación, quiero comportarme con "-" como un cero, pero los elementos que son iguales a "-" siempre se colocan en la parte superior de la tabla cuando el orden es igual a ASC o DSC , mientras que los otros elementos de la matriz se ordenan correctamente.
Si desea comportarse con "-" como un cero, en la función de clasificación puede agregar esto como su primera condición y devolver 0.
.sort((a, b) => { if (a[obj1][obj2] === "-") return 0; return Number(a[obj1][obj2]) > Number(b[obj1][obj2]) ? 1 : Number(b[obj1][obj2]) > Number(a[obj1][obj2]) ? -1 : 0 })Puede simplificar esto significativamente analizando primero los elementos comparados y luego aplicando una lógica simple para la clasificación.
Aquí se declara un solo customSort que acepta una matriz, una función para recuperar la propiedad relevante de cada elemento y una dirección booleana que por defecto es ascending: true .
Luego se accede al valor de cada elemento usando la función pasada y se convierte a un número (aquí con unario + ).
Finalmente, los elementos se ordenan primero por si isNaN , de lo contrario, se restan en función de la dirección booleana.
const customSort = (arr, prop, asc = true) => { return [...arr].sort((a, b) => { a = +prop(a); b = +prop(b); return isNaN(a) - isNaN(b) || (asc ? a - b : b - a); }) } const data = [{ prop1: { prop2: '2' } }, { prop1: { prop2: '5' } }, { prop1: { prop2: '3' } }, { prop1: { prop2: '1' } }, { prop1: { prop2: '-' } }, { prop1: { prop2: '9' } }, { prop1: { prop2: '-' } },]; const obj1 = 'prop1'; const obj2 = 'prop2'; console.log(customSort(data, (o) => o[obj1][obj2], true)); console.log(customSort(data, (o) => o[obj1][obj2], false));