Escribí un bucle for simple, para comprender mejor charCodeAt() y fromCharCode() y para resolver el proyecto odin, el ejercicio de cifrado César donde tienes que escribir la función para codificar una cadena.
Se detiene en la primera iteración y no sé por qué. Cuando registro en la consola str.charCodeAt(i), se repite, pero cuando agrego el resto de la función, se detiene.
function uniCode(str, num) { for(let i = 0; i < str.length;i++) { //console.log(str.charCodeAt(i) + num); let charCode = str.charCodeAt(i) + num; let newStr = String.fromCharCode(charCode); return newStr; } } uniCode("Help!", 3); 'K'¡Me alegro de cualquier ayuda!
¡Gracias!
con su código, recorre todos los caracteres de una cadena dada en el parámetro
pero tienes return newStr; en el ciclo detendrá la iteración del ciclo
function uniCode(str, num) { var newStr = ""; for(let i = 0; i < str.length;i++) { console.log(str.charCodeAt(i) + num); let charCode = str.charCodeAt(i); newStr += String.fromCharCode(charCode); } console.log(newStr); return newStr; } uniCode("Help!", 3);Se detiene porque usted se lo ha indicado, utilizando return newStr; , que finaliza inmediatamente la función y devuelve newStr .
Para lo que está haciendo, desea construir la nueva cadena y luego devolverla al final:
function uniCode(str, num) { let newStr = ""; for (let i = 0; i < str.length; i++) { let charCode = str.charCodeAt(i) + num; let newChar = String.fromCharCode(charCode); newStr += newChar; } return newStr; }Ejemplo en vivo:
function uniCode(str, num) { let newStr = ""; for (let i = 0; i < str.length; i++) { let charCode = str.charCodeAt(i) + num; let newChar = String.fromCharCode(charCode); newStr += newChar; } return newStr; } console.log(uniCode("Help!", 3)); // "Khos$" Sin embargo, tenga en cuenta que cuando recorre una cadena como esa, está trabajando en unidades de código , no en puntos de código, lo que puede hacer que sus resultados sean bastante extraños si hay puntos de código que requieren múltiples unidades de código para procesar. (Consulte la publicación de mi blog aquí si estos términos no le son familiares). Es posible que desee usar for-of en su lugar, ya que funciona en puntos de código:
function uniCode(str, num) { let newStr = ""; for (const char of str) { const codePointValue = char.codePointAt(0) + num; const newChar = String.fromCodePoint(codePointValue); newStr += newChar; } return newStr; }Ejemplo en vivo:
function uniCode(str, num) { let newStr = ""; for (const char of str) { const codePointValue = char.codePointAt(0) + num; const newChar = String.fromCodePoint(codePointValue); newStr += newChar; } return newStr; } function oldUniCode(str, num) { let newStr = ""; for (let i = 0; i < str.length; i++) { let charCode = str.charCodeAt(i) + num; let newChar = String.fromCharCode(charCode); newStr += newChar; } return newStr; } console.log("New: " + uniCode("Help!😀", 3)); // "New: Khos$😃" console.log("Old: " + oldUniCode("Help!😀", 3)); // "Old: Khos$𠈃"El problema aquí es la declaración de return al final del ciclo que causa el problema.
Puede crear una variable y newStr y, después del ciclo, devolver el valor de la cadena
function uniCode(str, num) { let finalStr = "" for(let i = 0; i < str.length;i++) { let charCode = str.charCodeAt(i) + num; let newStr = String.fromCharCode(charCode); finalStr = finalStr + newStr; } return finalStr } uniCode("Help!", 3); 'Khos$' Puede mejorar el código utilizando la función de reduce como:
function uniCode(str, num) { return str .split('') .map(x=>x.charCodeAt(0)) .reduce((total, curr) => (total + String.fromCharCode(curr + num)), "") }