Альтернативная заглавная буква в строке - PullRequest
0 голосов
/ 04 марта 2019

Я хотел бы создать функцию, которая чередует заглавные буквы.Например, Hello World станет HeLlO wOrLd.Первая буква строки всегда должна начинаться с заглавной буквы.

Вот код, который я написал:

function alternatingCaps(str) {
    let alternate = str.charAt(0).toUpperCase();
    for(let i = 1; i < str.length; i++) {
        let previousChar = str.charAt(i - 1);
        if(previousChar === previousChar.toUpperCase())
            alternate += str.charAt(i).toLowerCase();
        else if(previousChar === previousChar.toLowerCase())
            alternate += str.charAt(i).toUpperCase();
    }
    return alternate;
}

Я объявил переменную alternate с прописным первым символом предоставленной строки.,Затем я перебираю остаток строки и проверяю, является ли символ, предшествующий текущей итерации, прописным или строчным;Как бы то ни было, текущее письмо станет противоположным.

Однако, это не приведет к желаемому результату.Вот пара тестов и соответствующие результаты:

console.log(alternatingCaps('hello world'));
// Output: "HELLO wORLD"

console.log(alternatingCaps('jAvaScrIPT ruLEZ'));
// Output: "JAvAScRIpt rULez"

Как мне исправить мою функцию?

Ответы [ 3 ]

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

let s = 'hello there this is a test';
s = s.split('').map( (letter,i) => (i % 2) == 0 ?  letter.toUpperCase() : letter.toLowerCase() ).join('')
console.log( s );

Обновление: если вы хотите игнорировать, но сохранить пробелы, то есть другое решение, хотя и немного странное.Он не просто игнорирует пробелы, он только работает с буквами, соответствующими регулярному выражению.

let s = 'hello there this is a test';
let ul = false;
s = s.split('').map(letter => letter.match(/[a-zA-Z]/) != null ? (ul = ! ul, ul ? letter.toUpperCase() : letter.toLowerCase()) : letter).join('');
console.log( s );
0 голосов
/ 04 марта 2019

Мое решение использует RegEx для замены для достижения ожидаемого результата:

function alternatingCaps(str) {
    return str.replace(/\w(.|$)/g, s => s[0].toUpperCase() + (s[1] ? s[1].toLowerCase() : ''));
}

console.log(alternatingCaps('hello world'));

console.log(alternatingCaps('jAvaScrIPT ruLEZ'));

Следует обратить внимание на две вещи:

  • \w(.|$) - это регулярное выражение захватывает символ слова (\w) илюбой другой следующий символАдрес (.|$) для нечетного числа символов.Здесь мы в основном собираем символы в парах;
  • s => s[0].toUpperCase() + (s[1] ? s[1].toLowerCase() : '') - эта замещающая функция выполняет оставшуюся часть работы:
    • s[0].toUpperCase() - требуется s[0] и изменяется на
    • (s[1] ? s[1].toLowerCase() : '') - и требуется s[1], если он существует, и изменяет его на строчные.
0 голосов
/ 04 марта 2019

Самое простое решение, которое я могу придумать, это использовать для цикла и Остаток оператора.

let alterNate = (input) => {
  let str = ''
  let last = 'L'
  for(let i=0; i<input.length; i++){
   if( /[a-z]/ig.test(input[i]) ) {
      if(last==='L'){
        str+= input[i].toUpperCase()
        last = 'U'
      } else{
        str+= input[i].toLowerCase()
        last = 'L'
      }
   } else {
    str+=input[i]
   }
  }
  return str;
}

console.log(alterNate('hello world'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...