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

201
Vistas
¿Cómo ordenar una matriz de objetos correctamente por el valor del nombre alfanumérico de un objeto?

Estoy tratando de ordenar una matriz de objetos por el campo de nombre, pero el orden es incorrecto.

El orden que obtengo es [1, 10, 11, 2, 20, 21, 3]

En lugar de [1, 2, 3, .... 10, 11, 20, 21]

Está ordenando pero poniendo 10 delante de 2

Aquí está el código que estoy usando actualmente.

 const arr = [ { "name": "Action 10", "color": "transparent", "type": "components" }, { "name": "Action 11", "color": "transparent", "type": "components" }, { "name": "Action 2", "color": "transparent", "type": "components" }, { "name": "Action 20", "color": "transparent", "type": "components" }, { "name": "Action 21", "color": "transparent", "type": "components" }, { "name": "Action 3", "color": "transparent", "type": "components" }, { "name": "Action 4", "color": "transparent", "type": "components" }, { "name": "Action 5", "color": "transparent", "type": "components" }, { "name": "Action 6", "color": "transparent", "type": "components" }, { "name": "Action 1", "color": "transparent", "type": "components" } ] function sorter(a, b) { if (a.name < b.name) return -1; if (a.name > b.name) return 1; return 0; } console.log(arr.sort(sorter));

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

0

Se podría probar la opción de clasificación numeric de String.prototype.localeCompare ...

 const arr = [{ name: "Action 10", color: "transparent", type: "components" }, { name: "Action 11", color: "transparent", type: "components" }, { name: "Action 2", color: "transparent", type: "components" }, { name: "Action 20", color: "transparent", type: "components" }, { name: "Action 21", color: "transparent", type: "components" }, { name: "Action 3", color: "transparent", type: "components" }, { name: "Action 4", color: "transparent", type: "components" }, { name: "Action 5", color: "transparent", type: "components" }, { name: "Action 6", color: "transparent", type: "components" }, { name: "Action 1", color: "transparent", type: "components" }]; function sorter(a, b) { return a.name.localeCompare(b.name, undefined, { numeric: true }); } console.log(arr.sort(sorter));
 .as-console-wrapper { min-height: 100%!important; top: 0; }

about 4 years ago · Juan Pablo Isaza Denunciar

0

El orden es correcto. La cadena "Acción 10" recopila mayor que Action 1 y menor que Action 2 , porque la comparación de cadenas se realiza carácter por carácter.

El algoritmo para la comparación de cadenas se encuentra aquí: https://262.ecma-international.org/5.1/#sec-11.8.5

[Si] tanto px como py son cadenas

  • Si py es un prefijo de px , devuelve false . (Un valor de cadena p es un prefijo del valor de cadena q si q puede ser el resultado de concatenar p y alguna otra cadena r . Tenga en cuenta que cualquier cadena es un prefijo de sí mismo, porque r puede ser la cadena vacía).

  • Si px es un prefijo de py , devuelve true .

Sea k el entero no negativo más pequeño tal que el carácter en la posición k dentro de px es diferente del carácter en la posición k dentro de py . (Debe haber tal k , ya que ninguna Cadena es un prefijo de la otra).

  • Sea m el entero que es el valor de la unidad de código para el carácter en la posición k dentro de px .

  • Sea n el número entero que es el valor de la unidad de código para el carácter en la posición k dentro de py .

  • Si m < n , devuelve true . De lo contrario, devuelve false .

O, como una función de JavaScript, la expresión str1 < str2 se evalúa como si se invocara esta función (no es que alguien en su sano juicio implementaría el algoritmo como se describe en la especificación):

 function lt( px, py ) { const prefixOf = (x,y) => x.slice(0,y.length) === y; if ( prefixOf(px,py) ) return false; if ( prefixOf(py,px) ) return true; let k = 0 ; while ( px[k] === py[k] ) { ++k; } m = px.charCodeAt(k); n = py.charCodeAt(k); return m < n ? true : false; }

Si desea ordenar las cosas de acuerdo con el significado semántico de name , deberá dividir la cadena en una lista de sus segmentos numéricos y no numéricos, convertir los bits numéricos en números y luego comparar los segmentos en orden de izquierda a derecha. a derecha.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puedes usar expresiones regulares:

 const sorter = (a, b) => +a.name.match(/\d+/) - +b.name.match(/\d+/);

MANIFESTACIÓN

 const arr = [{"name": "Action 10","color": "transparent","type": "components"}, {"name": "Action 11","color": "transparent","type": "components"}, {"name": "Action 2","color": "transparent","type": "components"}, {"name": "Action 20","color": "transparent","type": "components"}, {"name": "Action 21","color": "transparent","type": "components"}, {"name": "Action 3","color": "transparent","type": "components"}, {"name": "Action 4","color": "transparent","type": "components"}, {"name": "Action 5","color": "transparent","type": "components"}, {"name": "Action 6","color": "transparent","type": "components"}, {"name": "Action 1","color": "transparent","type": "components"}] function sorter(a, b) { return +a.name.match(/\d+/)[0] - +b.name.match(/\d+/)[0]; } console.log(arr.sort(sorter));

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