Estoy trabajando en una función para aceptar la entrada de un usuario. Cuando el usuario envíe, ordenará ascendentemente por alfabeto y número a la derecha descendente. Por ejemplo, si la entrada del usuario es :
a98 @#$64b,ce>75d l3kj gh y la salida debería ser : abcdeghjkl9876543
Así que esto es lo que he hecho hasta ahora :
let sortNumButton = document.getElementById('sortNumButton'); let sortOutputContainer = document.getElementById('sortOutputContainer'); let inputField = document.getElementById('inputField'); sortNumButton.addEventListener('click', function(){ let string = document.createElement('p') string.innerText = inputField.value .split('') .sort((a,b) => isFinite(a) - isFinite(b) || a > b || -(a > b)) .join('') .replace(/[^a-zA-Z-0-9]/g, "") sortOutputContainer.appendChild(string) inputField.value = "" })Una forma de hacer esto es simplemente crear un sistema de puntuación para la comparación.
Por ejemplo, si somos un personaje, podemos usar charCodeAt para obtener su código de caracteres, solo devolverlo como un valor positivo.
Si somos un número, podríamos simplemente devolverlo como un número, digamos 1000-somechar y luego restar su valor.
p.ej..
const txt = 'a98 @#$64b,ce>75d l3kj gh'; const isNumeric = /[0-9]/; const isAlpha = /[az]/; const isAlphaNumeric = /[a-z0-9]/; function score(v) { if (isAlpha.test(v)) return v.charCodeAt(0); else return 1000-v; } console.log( txt.split('') .filter(t => isAlphaNumeric.test(t)) .sort((a,b) => score(a) - score(b)) .join('') )Otra opción, si tenemos caracteres limitados, podríamos simplemente crear una tabla de búsqueda simple y luego ordenar esto...
p.ej..
const txt = 'a98 @#$64b,ce>75d l3kj gh'; const isAlphaNumeric = /[a-z0-9]/; const lookup = 'abcdefghijklmnopqrstuvwxyz9876543210'; function score(v) { return lookup.indexOf(v); } console.log( txt.split('') .filter(t => isAlphaNumeric.test(t)) .sort((a,b) => score(a) - score(b)) .join('') )Puede usar expresiones regulares para extraer los números y las letras por separado y luego puede realizar la clasificación.
Demostración de trabajo:
// Input string const str = 'a98 @#$64b,ce>75d l3kj gh'; // letters string with sorting in ascending order. const lettersString = str.match(/[az]/g).sort().join(''); // Numbers string with sorting in descending order. const numbersString = str.match(/[0-9]/g).sort().reverse().join(''); // Result console.log(`${lettersString}${numbersString}`);Puede usar una expresión regular para extraer los números y las letras con match . Esto devuelve una matriz que luego puede join en una cadena para la salida.
Este ejemplo es un poco más funcional de lo que probablemente se necesite, pero muestra un enfoque diferente.
const str = 'a98 @#$64b,ce>75d l3kj gh'; // `comparator` gets called with a `type` // argument and returns a function that gets used // as the actual sort comparator. // We use `localCompare` to return a sorted array // based on the type. function comparator(type) { return function (a, b) { return ( type === 'str' ? a.localeCompare(b) > b.localeCompare(a) : a.localeCompare(b) < b.localeCompare(a) ); } } // `sort` accepts a type argument and // returns a string based on calling // the sort method on the array which calls the // comparator function with the type, and once that // process is complete returns a string function sort(data, type) { return data.sort(comparator(type)).join(''); } // `match` returns an array, so we pass that to // the sort function with a type parameter const letters = sort(str.match(/[az]/g), 'str'); const numbers = sort(str.match(/[0-9]/g), 'num'); console.log(`${letters}${numbers}`);Información Adicional