Форматировать регистр имен при повторении первой буквы - PullRequest
0 голосов
/ 04 марта 2019

У меня есть функция, которая принимает массив имен и возвращает новый массив, в котором первая буква каждого имени преобразуется в верхний регистр (а остальные буквы в нижний регистр).

function capMe(arr) {
  let newArr = [];
  arr.forEach(function(name) {
    name = name.replace(name[0], name[0].toUpperCase());
    for(let i = 1; i < name.length; i++) {
        name = name.replace(name[i], name[i].toLowerCase());
    }
    newArr.push(name);
});
return newArr;
}

Это работает для подавляющего большинствавремя.Например, если я вызову функцию следующим образом:

console.log(capMe(['jACKSON', 'pAM', 'wiLliAm']));

, я получу желаемый результат: > Array ["Jackson", "Pam", "William"].

Однако есть один случай, когда эта функция не работает,Если я вызываю функцию с именем, в котором повторяется первая буква, каждая буква будет строчной, за исключением второго вхождения буквы.

Например, если я добавлю gEORGANN к предыдущему примеру, яполучит этот вывод:

> Array ["georGann", "Jackson", "Pam", "William"]

Как мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Ваша логика кодирования в порядке.Проблема в порядке операций.Пожалуйста, смотрите ниже;

function capMe(arr) {
    let newArr = [];
    arr.forEach(function(name) {
      name = name.toLowerCase();
      name = name.replace(name[0], name[0].toUpperCase());
      newArr.push(name);
    });
   return newArr;
}
console.log(capMe(['gEORGANN', 'pAM', 'wiLliAm', 'AA']));
0 голосов
/ 04 марта 2019

Вот, пожалуйста,

const capMe = (arr = []) => {
  return arr.map((name) => {
    const [first, ...rest] = name;
    return `${first.toUpperCase()}${rest.join('').toLowerCase()}`;
  });
}

console.log(capMe(['foo', 'foZBaz']));
0 голосов
/ 04 марта 2019

Ваша текущая логика не делает то, что вы думаете.Рассмотрим следующую строку, которая появляется в цикле над каждым именем:

name = name.replace(name[i], name[i].toLowerCase());

Это заменяет только символ first , который равен name[i], строчной версией этой буквы.Вот как это сбрасывает вашу логику с ввода gEORGANN.Сначала вы заглавные буквы первые g, чтобы получить GEORGANN.Затем, когда цикл достигает четвертой позиции, которая является заглавной G, он заменяет first G на строчную g.Это оставляет нас с gEORGANN, но это не то, что вы намереваетесь.Причина этого в том, что replace просто попадает в первое вхождение.

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

arr = ['georGann', 'jACKSON', 'pAM', 'wiLliAm'];
newArr = [];
arr.forEach(function(name) {
    newName = name.charAt(0).toUpperCase() + name.substring(1).toLowerCase()
    newArr.push(newName);
});
console.log(arr);
console.log(newArr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...