Estoy haciendo una función de JavaScript que ingresará una cadena y generará un "texto de burla de bob esponja", básicamente, ingresas "Hola, este es un mensaje para el mundo" y obtendrías "Hola, ESTE ES UN MENSAJE AL MUNDO" Básicamente, decida al azar si utilizar mayúscula o no. Hice una función que pensé que haría eso, pero no funcionó. Aquí está el código que probé en la consola js:

function memify(input) { // function called memify()

var il = input.length;  // gets the length of the input
var newinput = input; // creates a new variable that will be changed from input.

  for (var i=0;i>il;i++) {

  var rng = Math.floor((Math.random()*2)); // random number between 0 and 1. 0 = upper 1 = lower

  if (rng === 0) {


    newinput.charAt(i).toUpperCase();


  }
  else {

    newinput.charAt(i).toLowerCase();

  }



  }


 return newinput; 
}
var text = prompt();
var textmeme = memify(text);
alert(textmeme);

¿Por qué esto no funciona? ¿Tengo un error en mi código? Cualquier ayuda será apreciada.

1
Questionable_Mushroom 23 dic. 2019 a las 01:02

2 respuestas

O una solución más concisa, segura y generalmente mejor :). No requiere bucle, comprobación de la longitud de la cadena y otras cosas propensas a errores.

function memify(input) {
    var rng = () => Math.random() > 0.5; 
    var res = input.split('').map( letter => 
        rng() ? letter.toUpperCase() : letter.toLowerCase()
    ).join('');
    return res;
}

var textmeme = memify("Hello World");
console.log(textmeme);

Por favor, vote si fue útil :)

2
Scalway 22 dic. 2019 a las 22:17

Cuando lo haces

newinput.charAt(i).toUpperCase();

Estás creando un nuevo personaje en mayúscula, pero no estás haciendo nada con él; es solo una expresión no utilizada, por lo que no hay cambios visibles. Las primitivas (incluidas las cadenas) son inmutables: debe reasignar explícitamente una cadena a otra cosa (por ejemplo, newString += newinput.charAt(i).toUpperCase();) para ver un efecto.

También necesitas usar

for (var i = 0; i < il; i++) {
//                ^

En lugar de

for (var i = 0; i > il; i++) {
//                ^

De lo contrario, no se ejecutarán iteraciones en absoluto.

function memify(input) { // function called memify()
  var il = input.length; // gets the length of the input
  let changedStr = '';
  for (var i = 0; i < il; i++) {
    var rng = Math.floor((Math.random() * 2)); // random number between 0 and 1. 0 = upper 1 = lower
    if (rng === 0) {
      changedStr += input.charAt(i).toUpperCase();
    } else {
      changedStr += input.charAt(i).toLowerCase();
    }
  }
  return changedStr;
}
var text = prompt();
var textmeme = memify(text);
console.log(textmeme);

Otra opción, usando .map, que se ve mucho más limpia IMO:

const memify = input => [...input]
  .map(char => Math.random() < 0.5 ? char.toUpperCase() : char.toLowerCase())
  .join('');

console.log(memify(prompt()));
3
CertainPerformance 22 dic. 2019 a las 22:08