¿Cómo invierto cada mayúscula y minúscula ("Soy un gran humano") a ("I ma A Taerg namuh")? Este es el código que tengo:
function wordsReverse(str) { let words = []; words = str.match(/\S+./g); let result = ""; for (let i = 0; i < words.length; i++){ result += words[i].split('').reverse().join('') + " "; } return result; } console.log(wordsReverse("I am A Great human")); // Logs "I ma A taerG namuh"En lugar de obtener "I ma A taerG namuh"
Estoy buscando esto: "I ma A Taerg namuh"
Una forma sería rastrear los índices de los caracteres en mayúsculas en la palabra original y, al invertir la palabra, usar esos valores de índice anteriores para poner en mayúsculas el carácter.
Si el índice no coincide con un carácter previamente en mayúsculas, siempre devuélvalo en minúsculas (incluso si ya está en minúsculas, esto no tendrá ningún efecto).
function wordReverse(str) { let reversed = []; let words = str.split(" "); for (let word of words) { // Calculate which indices in the word are uppercase, // storing in an object for faster lookups let uppercaseIndices = word.split("").reduce((acc, char, i) => { if (/[AZ]/.test(char)) { acc[i] = true; } return acc; }, {}); let newWord = word .split("") .reverse() .map((char, i) => { if (uppercaseIndices[i]) { return char.toUpperCase(); } else { return char.toLowerCase(); } }) .join(""); reversed.push(newWord); } return reversed.join(" "); } console.log(wordReverse("I am A Great human")); function wordsReverse(str) { let indexes = []; let words = str.split(" "); let result = ""; // reverse passed string words.forEach((e) => { result += e.split("").reverse().join("") + " "; }); // get indexes of uppercase letters passed in function str.split("").forEach((e, i) => { if (e === e.toUpperCase() && e !== " ") { indexes.push(i); } }); // lowercase whole string result = result.trim().toLowerCase().split(""); // uppercase letters accordingly to indexes we get from index array result.forEach((e, i) => { if (indexes.includes(i)) { result.splice(i, 1, e.toUpperCase()); } }); return result.join(""); } console.log(wordsReverse("I am A Great human"));Puede dividir la cadena en palabras y probar cada una con Array#map y también dividir cada palabra en letras y probar cada letra usando Array#map como en esta demostración rápida:
const wordsReverse = str => str.split(' ').map( word => word.split('').reverse() .map( (letter, i, arr) => arr[arr.length - i - 1].toUpperCase() === arr[arr.length - i - 1] ? letter.toUpperCase() : arr[arr.length - i - 1].toLowerCase() === arr[arr.length - i - 1] ? letter.toLowerCase() : letter ) .join('') ) .join(' '); console.log(wordsReverse("I am A Great human")); //OUTPUT: I ma A Taerg namuh