He hecho algo similar en el pasado con un bucle anidado, pero por alguna razón no puedo pensar en esto para que funcione. Sigo teniendo problemas que involucran la indexación de dos matrices separadas y ha sido un obstáculo continuo
En este caso, estoy tratando de ordenar una cadena. La cadena incluye letras y números, la tarea es ordenar las letras en orden alfabético inverso manteniendo los números en su mismo índice.
Se me ocurrió esta solución (probablemente no sea la más eficiente), pero no puedo hacer que la matriz sortString se una para poder unir las letras y los números en una cadena.
function reverse(str) { // split the str into an array const arr = [...str] // converts each element in arr to a number, letters are string 'NaN' const numArray = arr.map(x=> Number(x)).map(x=> x >= 0 ? x : String(x)) // array of the sorted letters const letters = arr.filter(x=> !/[0-9]/g.test(x)).reverse() // initiate empty array to hold the combined numbers and letters let sortString = [] // Use for loop to cycle through and replace elements that are 'NaN' with letters from the letter array. All pushed to sortString. for (let i=0; i<arr.length; i++) { sortString.push(numArray[i] === 'NaN' ? letters[0] : numArray[i]) } return sortString } reverse("ab89c") // output should be "cb89a"Aquí hay un código que funciona:
La explicación de cómo funciona el código está en línea como comentarios.
Básicamente, saca los números, ordena las letras al revés y vuelve a colocar las letras ordenadas en el lugar correcto.
Debido a que es paso a paso, puede agregar el registro de la consola en cada variable después de asignarla para ver cómo funciona paso a paso.
function reverse(input) { // This function from: https://stackoverflow.com/a/32567789/569302 function testIsLetter(c) { return c.toLowerCase() != c.toUpperCase(); } // Convert from array to string to process character by character let inputAsArray = input.split(''); // This is where we'll lookup where to put the letters when we're done let mapped = inputAsArray.map((s) => { return { s, isLetter: testIsLetter(s) } }) // Now that we've captured where the letters are, take the numbers (non-letters) out let filtered = mapped.filter(m => m.isLetter) // Convert the object into just letters so they're easily compared when we sort let filteredAsLettersArray = filtered.map(f => fs) // Sort ascending filteredAsLettersArray.sort() // Reverse to sort descending filteredAsLettersArray.reverse() // Now we need to put the letters back. let resultAsArray = []; let letterIndex = 0; mapped.forEach(m => { // If it's a letter, we use the sorted result (incrementing letterIndex each time) if (m.isLetter) { resultAsArray.push(filteredAsLettersArray[letterIndex]); letterIndex++; } else { // Otherwise we use the number resultAsArray.push(ms); } }); let result = resultAsArray.join(''); return result; } console.log(reverse("ab89c")); console.log(reverse("1a2eb8f9c"));Puede obtener una matriz de no dígitos, ordenarla y mapear la cadena dividida con las letras ordenadas en lugares si no es un dígito.
const reverse = string => { const array = Array.from(string), letters = array .filter(v => /\D/.test(v)) .sort(); return array .map(v => /\D/.test(v) ? letters.pop() : v) .join(''); }; console.log(reverse("ab89c")); Un enfoque ligeramente diferente toma un Proxy para los elementos de clasificación deseados:
¿Cómo ordenar solo una parte de la matriz? entre índices dados