Búsqueda de sitios web

javascript - ¿Por qué array[i].charAt(0).toUpperCase() no se pasa a array[i][0]?


Estoy intentando hacer un programa en JavaScript que tome una cadena y ponga en mayúscula la primera letra de cada palabra y haga que todos los demás caracteres estén en minúscula.

function titleCase(str) {
  str = str.toLowerCase();
  var array = str.split(" ");
  for(var i =0; i< array.length ; i++){
    array[i][0] = array[i].charAt(0).toUpperCase();

  } 
  var finalString = array.join(" ")
  return finalString ; 
}

console.log(titleCase("I'm a little tea pot"));

Por alguna razón array[i].charAt(0).toUpperCase(); no pasa su valor a array[i][0]. Esto termina haciendo que devuelva la cadena con todas las letras en minúscula en lugar de tener la primera letra de cada palabra en mayúscula.

Respuesta #1

Las cadenas de JavaScript son inmutables, por lo que en realidad no puedes cambiar caracteres individuales indexándolos usando el operador []. Aquí hay una versión corregida que usa substring para construir la cadena final en su lugar:

Demostración en vivo:

function titleCase(str) {
  str = str.toLowerCase();
  var array = str.split(" ");
  for(var i =0; i< array.length ; i++){
    array[i] = array[i].charAt(0).toUpperCase() + array[i].substring(1);

  } 
   var finalString = array.join(" ")
  return finalString ; 
}

alert(titleCase("I'm a little tea pot"));

Versión de JSFiddle: https://jsfiddle.net/rakdtpbb/

Respuesta #2

Parece que quieres hacer algo más como esto:

function titleCase(str) {
  str = str.toLowerCase();
  var array = str.split(" ");
  for(var i =0; i< array.length ; i++){
    //array[i] is an immutable string. So we need to rebuild it instead.
    array[i] = array[i].charAt(0).toUpperCase() + array[i].substring(1);
  } 
  var finalString = array.join(" ")
  return finalString; 
}

titleCase("I'm a little tea pot");

Las cadenas pueden ser leídas como arreglos de caracteres usando la notación de corchetes. Sin embargo, no se puede cambiar un carácter en particular de esa manera ya que las cadenas no son objetos mutables.