Новый человек здесь работает над игрушечной проблемой, создавая функцию, которая преобразует строку в верблюжий регистр везде, где есть тире или подчеркивание. У меня почти все отработано, кроме предпоследней строки функции, где я пытаюсь изменить символы в каждом индексе (из моего индексного массива) на верхний регистр, прежде чем возвращать строку. Ошибка, которую я получаю, - это неправильное назначение с левой стороны, но я не уверен, почему. Я зарегистрировал в консоли обе стороны задания, и они, кажется, делают то, что я хочу, но само задание не работает. Спасибо за любую помощь!
Вот код:
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;
}
Ответ 1 · рейтинг 2 · Guilherme Lemmi
Проблема заключается в использовании 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('');
}
Ответ 2 · рейтинг 1 · mateotherock
Ах, спасибо вам обоим за то, что указали мне правильное направление. Вместо того, чтобы присоединять его обратно к строке, я воспользовался тем, что он уже является массивом, и просто сначала просмотрел его.
Этот код сработал...
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;
}
Ответ 3 · рейтинг 1 · Nina Scholz
Для подхода путем повторения символов вы можете использовать флаг для следующей буквы верхнего регистра.
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'));