Недопустимая левая часть в выражении присваивания

Новый человек здесь работает над игрушечной проблемой, создавая функцию, которая преобразует строку в верблюжий регистр везде, где есть тире или подчеркивание. У меня почти все отработано, кроме предпоследней строки функции, где я пытаюсь изменить символы в каждом индексе (из моего индексного массива) на верхний регистр, прежде чем возвращать строку. Ошибка, которую я получаю, - это неправильное назначение с левой стороны, но я не уверен, почему. Я зарегистрировал в консоли обе стороны задания, и они, кажется, делают то, что я хочу, но само задание не работает. Спасибо за любую помощь!

Вот код:

function toCamelCase(str){
  var stringArray = str.split('');
  var indexArray = [];
  stringArray.forEach(character => {
    if (character === '-' || character === '_') {
      var index = str.indexOf(character);
      str = str.slice(0, index) + str.slice(index+1)
      indexArray.push(index);
    }
    return character;
  })
  indexArray.forEach(index => {stringArray.splice(index, 1)});
  string = stringArray.join('');
  indexArray.forEach(index => {string.charAt(index) = string.charAt(index).toUpperCase()});
  return string;
}


person mateotherock    schedule 27.04.2018    source источник


Ответы (4)


Проблема заключается в использовании string.charAt() слева. Это невозможно, поскольку вы пытаетесь присвоить что-то результату функции в одном и том же вызове. Сохраните значение string.charAt() в промежуточной переменной, и оно должно работать. Проверьте код ниже для рабочего примера, используя немного другой подход:

function toCamelCase(str){
  var stringArray = str.split('');
  var indexArray = [];
  stringArray.forEach(character => {
    if (character === '-' || character === '_') {
      var index = str.indexOf(character);
      str = str.slice(0, index) + str.slice(index+1)
      indexArray.push(index);
    }
    return character;
  });
  indexArray.forEach(index => {stringArray.splice(index, 1)});
  return stringArray.map((char, index) => {
    return indexArray.includes(index) ? char.toUpperCase() : char;
  }).join('');
}
person Guilherme Lemmi    schedule 27.04.2018

Ах, спасибо вам обоим за то, что указали мне правильное направление. Вместо того, чтобы присоединять его обратно к строке, я воспользовался тем, что он уже является массивом, и просто сначала просмотрел его.

Этот код сработал...

function toCamelCase(str){
  var stringArray = str.split('');
  var indexArray = [];
  stringArray.forEach(character => {
    if (character === '-' || character === '_') {
      var index = str.indexOf(character);
      str = str.slice(0, index) + str.slice(index+1)
      indexArray.push(index);
    }
    return character;
  })
  indexArray.forEach(index => {stringArray.splice(index, 1)});
  indexArray.forEach(index => {stringArray[index] = stringArray[index].toUpperCase()});
  var string = stringArray.join('');
  return string;
}

person mateotherock    schedule 27.04.2018

Для подхода путем повторения символов вы можете использовать флаг для следующей буквы верхнего регистра.

function toCamelCase(str) {
    var upper = false;

    return str
        .split('')
        .map(c => {
            if (c === '-' || c === '_') {
                upper = true;
                return '';
            }
            if (upper) {
                upper = false;
                return c.toUpperCase();
            }
            return c;
        })
        .join('');
}

console.log(toCamelCase('foo----bar_baz'));

person Nina Scholz    schedule 27.04.2018

Как бы странно это ни звучало, что исправило эту ошибку, добавив ; точка с запятой в конце строки, где встречается Parsing error: Invalid left-hand side in assignment expression. Дополнительный контекст здесь.

person Lukasz Dynowski    schedule 05.03.2020