Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

179
Vistas
Por favor, ¿interpreto este operador ternario?

Por favor, si esta función se convirtiera en una declaración if else "normal", ¿cómo se vería?

 export const orderArr = (arr: any[], key: string) => arr.sort((a, b) => ((a[key] > b[key]) ? 1 : (a[key] === b[key]) ? ((a[key] > b[key]) ? 1 : -1) : -1));

Quiero agregar otra condición, pero me resulta difícil leer o digerir el flujo actual.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Primero, expandamos el código para que sea (ligeramente) más fácil de leer.

Tenga en cuenta que el ?: contiene una lógica cuestionable, el uso de === parece sugerir que está tratando de manejar la clasificación de una matriz de tipos mixtos, pero luego usa comparaciones < y > no estrictas. Entonces, para los fines del resto de esta respuesta, supondré que no está tratando de ordenar matrices de tipos mixtos o que, si lo está, ignorará las comparaciones de tipo estrictas (es decir, el === realmente debería ser == )

 function orderArr (arr: any[], key: string) { function sorter(a, b) { return ( (a[key] > b[key]) ? 1 : (a[key] === b[key]) ? ( (a[key] > b[key]) ? 1 : -1 ) : -1 ); } return arr.sort(sorter); } export orderArr;

Ahora volvamos a escribir la expresión ?: demasiado complicada (demasiado complicada no por la sintaxis ?: sino porque está haciendo más de lo necesario) y reescribiéndola como si fuera otra cosa (tenga en cuenta que este código sigue siendo incorrecto)

 function sorter(a, b) { if (a[key] > b[key]) { return 1; // return 1 if a > b } else { if (a[key] === b[key]) { // questionable logic if (a[key] > b[key]) { // questionable logic return 1; } else { return -1; // will always return -1 (wrong, a == b should return 0) } } else { return -1; // return -1 if a < b // or if type of a does not equal type of b (questionable) } } }

Ahora simplifiquemos y solucionemos el error (es decir, eliminemos la comparación estricta de tipos). Usar una técnica llamada devolución anticipada (también llamada cláusulas de guardia) y evitar usar otra cosa, ya que agrega sangría y complicaciones innecesarias.

 function sorter(a, b) { if (a[key] > b[key]) return 1; if (a[key] < b[key]) return -1; return 0; }

O si lo prefieres, usando ?: sintaxis

 function sorter(a, b) { return a[key] > b[key] ? 1 : a[key] < b[key] ? -1 : 0; }

Si está ordenando números, puede usar un pequeño truco para simplificar aún más el código. Ordenar espera un 0 si a y b son iguales, un valor negativo si a < b y un valor positivo si a > b , por lo que para la clasificación numérica simplemente podemos hacer

 function sorter(a, b) { return a[key] - b[key]; }

Ahora, volvamos a juntar todo el código simplificado en una sola línea. Primero para cualquier tipo de matriz.

 export const orderArr = (arr: any[], key: string) => arr.sort((a, b) => a[key] > b[key] ? 1 : a[key] < b[key] ? -1 : 0);

y para una matriz solo numérica

 export const orderArr = (arr: any[], key: string) => arr.sort((a, b) => a[key] - b[key]);
about 4 years ago · Juan Pablo Isaza Denunciar

0

Editar:

De acuerdo con la respuesta de @Erich Kitzmueller, eliminé una parte [clave] === b[clave] :

 export const orderArr = (arr: any[], key: string) => arr.sort((a, b) => { if(a[key] > b[key]){ return 1; } else { return -1; } } );

Respuesta original:

No estoy seguro acerca de la estructura de la función de clasificación, pero la declaración if podría verse a continuación:

 export const orderArr = (arr: any[], key: string) => arr.sort((a, b) => { if(a[key] > b[key] || a[key] === b[key]){ return 1; } else { return -1; } } );
about 4 years ago · Juan Pablo Isaza Denunciar

0

export const orderArr = (arr: any[], key: string) => arr.sort((a, b) => ((a[key] > b[key]) ? 1 : (a[key] === b[key]) ? ((a[key] > b[key]) ? 1 : -1) : -1));

es igual a:

 export const orderArr = (arr: any[], key: string) => { return arr.sort((a, b) => { if (a[key] > b[key]) { return 1; } else if (a[key] === b[key]) { if (a[key] > b[key]) { return 1; } else { return -1; } } else { return -1; } }) }

Creo firmemente que no es necesario usar operadores ternarios anidados de más de 3 niveles en ningún lugar porque es un gran sacrificio de legibilidad del código sin ningún motivo.

Siéntase libre de reescribir el método a if/else común o switch declaraciones para mantener su código claro.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda