@sultan19
Frontend

Почему не получается перезаписать символ в двумерном массиве?

function titleCase(str) {
  str = str.toLowerCase();
  let mass = str.split(' ');
  
  for(let i in mass)
  {
    mass[i][0] = mass[i][0].toUpperCase();  
    
  }
  
  return mass;
}

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


Почему не получается перезаписать символ в массиве?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
То, что вы понимаете под словом "символ" - этого в JS нет. Есть строки единичной длины.

Перезаписать вы пытаетесь элемент не массива, а строки. Это невозможно - строки в JS иммутабельны.

Создавайте новую строку:

const titleCase = str => str
  .toLowerCase()
  .split(' ')
  .map(n => n[0].toUpperCase() + n.slice(1))
  .join(' ');

или

const titleCase = str => str
  .toLowerCase()
  .replace(/(?<=^| )./g, m => m.toUpperCase());

или

const titleCase = str => Array
  .from(str, (n, i) => n[i && str[i - 1] !== ' ' ? 'toLowerCase' : 'toUpperCase']())
  .join``;
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Строку разбили по пробелам на слова. И затем у каждого слова пытаетесь заменить первый символ на его заглавную версию. Но вот такой доступ к строке как к массиву букв работает только «для чтения»:
mass[i][0]

Нельзя просто взять и .. заменить символ в строке.

См. Доступ к символам:
отрывок документации
Другим способом (введённым в ECMAScript 5) является рассмотрение строки как массивоподобного объекта, в котором символы имеют соответствующие числовые индексы:
return 'кот'[1]; // вернёт "о"
При доступе к символам посредством нотации с квадратными скобками, попытка удалить символ, или присвоить значение числовому свойству закончится неудачей, поскольку эти свойства являются незаписываемыми и ненастраиваемыми. Смотрите документацию по методу Object.defineProperty() для дополнительной информации.


Вариант решения – сделать из каждого слова настоящий массив букв:
const titleCase = str => str
    .toLowerCase()
    .split(' ')
    .map(word => {
      const chararr = word.split('');
      chararr[0] = chararr[0].toUpperCase();
      return chararr.join('');
    })
    .join(' ');

  titleCase("I'm a little pea"); // I'm A Little Pea
  titleCase("I love the sky and the trees"); // I Love The Sky And The Trees
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы