Necesito ordenar una tabla que tiene columnas de diferentes tipos de datos. El problema de ordenar las cadenas es que distinguen entre mayúsculas y minúsculas. el codigo original es
const Details = sortWith( sortDir === 'ASC' ? ascend((row) => row.data[col]) : descend((row) => row.data[col]) )
y lo actualicé a lo siguiente que funciona
const Details = sortWith( sortDir === 'ASC' ? ascend((row) => typeof row.data[col] === 'string' ? row.data[col].toLowerCase() : row.data[col]) : descend((row) => typeof row.data[col] === 'string' ? row.data[col].toLowerCase() : row.data[col]) )
¿Hay una mejor manera de hacer esto?
Bienvenido a Stack Overflow. Por favor, en el futuro, intente publicar un ejemplo mínimo reproducible con su pregunta.
No estoy seguro de si esto ayudará, pero aquí hay un generador de funciones de clasificación basado en la configuración, construido sobre las capacidades de clasificación de Ramda:
const mySorter = (config) => sortWith (config .map ( ({col, sortDir = 'ASC'}) => (sortDir == 'ASC' ? ascend : descend) (pipe (path (['data', col]), when (is (String), toLower))) )) const data = [{data: {first: 'Fred', last: 'Flintstone', age: 31}}, {data: {first: 'Wilma', last: 'Flintstone', age: 29}}, {data: {first: 'pebbles', last: 'flintstone', age: 1}}, {data: {first: 'Barney', last: 'Rubble', age: 29}}, {data: {first: 'bambam', last: 'Rubble', age: 1.5}}, {data: {first: 'Betty', last: 'Rubble', age: 33}}] console .log ( mySorter ([{col: 'age'}, {col: 'last', sortDir: 'DESC'}]) (data) ) console .log (mySorter ([{col: 'first'}]) (data))
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script>const {sortWith, ascend, descend, pipe, path, when, is, toLower} = R</script>
La parte sobre poner en minúsculas solo las cadenas es when (is (String), toLower)
, que parece eminentemente legible.
Si desea evitar repetirse en la clasificación, puede aislar la función typecheck:
const stringCheck = (row) => typeof row.data[col] === 'string' ? row.data[col].toLowerCase() : row.data[col]
y entonces:
const Details = sortWith( sortDir === 'ASC' ? ascend(stringCheck) : descend(stringCheck) )
Puede usar la llamada de función opcional, se ejecutará solo si ese método está definido para el tipo:
row.data[col].toLowerCase?.() ?? row.data[col]
La llamada de función opcional devolverá undefined
si el método no está definido, por esta razón necesitamos ?? row.data[col]
para recuperar el valor anterior.