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

140
Vistas
Ordenar matriz de números usando lodash/Javascript

Tengo una matriz de cadenas como la siguiente.

 let arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];

Quiero el resultado esperado como se muestra a continuación.

 ["1+", "1", "1-", "2+", "2", "2-", "3+", "3", "3-", "4", "10"];

Probé el siguiente código pero no me está dando el resultado correcto.

 let arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"]; let result = arr.sort((a,b) => { return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base', }); }); console.log(result);

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Por lo tanto, necesita un comparador de números y signos.

Concepto general:
Puede definir la prioridad de la señal de esta manera:

 const signPriority = { '+': 0, 'n': 1, // n = no sign '-': 2, }

Donde key es el signo y el value es el peso del signo, lo usaremos en el comparador ( 'n' significa "sin signo").

Luego, dividiremos los elementos de la matriz para numerarlos y firmarlos, en la función de comparación y compararlos por separado:

 arr.sort((a, b) => { // If numbers are different ... if (parseInt(a) !== parseInt(b)) { // Just compare a numbers return parseInt(a) - parseInt(b); } else { // If sign matter ... // Extract sign from element or define as 'n' if no sign found const sign_a = ['+', '-'].includes(a.slice(-1)) ? a.slice(-1) : 'n'; const sign_b = ['+', '-'].includes(b.slice(-1)) ? b.slice(-1) : 'n'; // Compare signs using their weight return signPriority[sign_a] - signPriority[sign_b]; } })

Solución completa:

 const signPriority = { '+': 0, 'n': 1, '-': 2, } const arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"]; const sorted = arr.sort((a, b) => { if (parseInt(a) !== parseInt(b)) { return parseInt(a) - parseInt(b); } else { const sign_a = ['+', '-'].includes(a.slice(-1)) ? a.slice(-1) : 'n'; const sign_b = ['+', '-'].includes(b.slice(-1)) ? b.slice(-1) : 'n'; return signPriority[sign_a] - signPriority[sign_b]; } }) console.log(sorted);

over 4 years ago · Santiago Trujillo Denunciar

0

Debe intentar convertir la cadena en un número decimal y luego comparar. Por ejemplo, si convierte "2+" a 1,9 y "2-" a 2,1, puede comparar valores como números.

 const arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"]; function convertToNumber(text) { const offset = text.endsWith("+") ? -0.1 : text.endsWith("-") ? 0.1 : 0; if (text.endsWith("+") || text.endsWith("-")) { text = text.substring(0, text.length - 1); } return parseFloat(text) + offset; } const sorted = arr.sort((a, b) => { return convertToNumber(a) > convertToNumber(b); }); console.log("Sorted: ", sorted);

over 4 years ago · Santiago Trujillo Denunciar

0

Divida cada cadena usando un límite de palabra regex. Utilice la desestructuración para obtener el número en forma de cadena ( an , bn ) y el signo ( as , bs ). Si el signo no está undefined , use una coma como respaldo, ya que la coma se encuentra entre + y - en la tabla ASCII.

El valor de retorno debe ser an - bn (diferencia de números emitidos automáticamente), y si es 0 , entonces use bs?.localeCompare(as) para ordenar por el signo.

 const arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"]; const getNumAndSign = str => str.split(/\b/) const sorted = arr.sort((a, b) => { const [an, as = ','] = getNumAndSign(a) const [bn, bs = ','] = getNumAndSign(b) return +an - +bn || bs?.localeCompare(as) }) console.log(sorted);

over 4 years ago · Santiago Trujillo 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