написать функцию, которая принимает строку и возвращает новую строку с использованием только заглавных букв, переданных в строку - PullRequest
0 голосов
/ 16 января 2019

, поэтому я действительно пришел к этому предложению в руководстве по javascript от rithm school (что очень хорошо): напишите функцию с именем onlyCapitalLetters, которая принимает строку и возвращает новую строку с использованием только заглавных букв, переданных в строка. это запрошенный вывод:

onlyCapitalLetters("Amazing") // "A"
onlyCapitalLetters("nothing") // ""
onlyCapitalLetters("EVERYTHING") // "EVERYTHING"

у вас есть это решение, но оно использует метод .charCodeAt (), о котором они раньше не говорили, а также кажется довольно сложным. сейчас я читаю много документации, связанной с ней, но до сих пор не могу ее откопать.

Прежде чем я приступил к их решению, Iv'e попробовал что-то еще самостоятельно, основываясь на том, что уже было представлено в этом уроке.

решение школы ритма:

function onlyCapitalLetters(str){
  var newStr = '';
  for(var i = 0; i < str.length; i++){
    if(str[i].charCodeAt(0) < 91 && str[i].charCodeAt(0) > 64 ){
      newStr += str[i];
    }    
  }
  return newStr;
}

моя попытка:

function onlyCapitalLetters(string) {
  var newString = '';
  for(i=0;i<string.length;i++) {
    if(string[i] === string[i].toUpperCase) {
    } newString += string[i];
  }
  return newString;
}

хотя, когда я бросил строку в качестве аргумента, например

onlyCapitalLetters('TbRnY OnUmT');

он вернул мне строку как есть, вставив новую, только заглавную строку.

"TbRnY OnUmT"

Есть ли способ, более в этом упрощенном направлении, которое я пытался, сделать так, чтобы эта функция выполнялась? Кроме того, есть ли у кого-нибудь понимание этого charCodeAt и его решения в целом? Это мой первый пост, так что в любом случае спасибо за вашу помощь!

Ответы [ 6 ]

0 голосов
/ 16 января 2019

Другая опция использует array destructuring в качестве параметра функции.

const onlyCapitalLetters = ([...myarr] = e) => myarr.filter(el => el === el.toUpperCase()).join('');


console.log(onlyCapitalLetters("Amazing"));
console.log(onlyCapitalLetters("nothing"));
console.log(onlyCapitalLetters("EVERYTHING"));
0 голосов
/ 16 января 2019

Вот компактное решение

var string = "ABCefgGHaI";

Прежде всего замените все символы кроме алфавитов

string.replace(/[^a-z]/gi, '')

(string.split('').filter((item)=>{return item == item.toUpperCase()})).join("")

Вы можете сделать это, разделив слово и отфильтровав только те, которые в верхнем регистре, и присоединиться к ним:)

0 голосов
/ 16 января 2019

Чтобы исправить ваш код, используйте toUpperCase () , включая скобки, и объедините строку внутри оператора if:

if (string[i] === string[i].toUpperCase()) {
  newString += string[i];
}

Обратите внимание, что, как указывает @ CodeManiac , эта функция не удаляет специальные символы из строки. Использование nothing@# вернет @#

Например

function onlyCapitalLetters(string) {
  var newString = '';
  for (let i = 0; i < string.length; i++) {
    if (string[i] === string[i].toUpperCase()) {
      newString += string[i];
    }
  }
  return newString;
}

console.log(onlyCapitalLetters('TbRnY OnUmT'));
console.log(onlyCapitalLetters('nothing@#'));

Другой вариант может состоять в том, чтобы заменить не символ верхнего регистра или символ пробела пустой строкой:

function onlyCapitalLetters(string) {
  return string.replace(/[^A-Z\s]+/g, '');
}

console.log(onlyCapitalLetters('TbRnY OnUmT'));
0 голосов
/ 16 января 2019

function onlyCapitalLetters(string) {

    // prime the function response.
    let response = "";

    // match all groups of uppercase letters.
    let result = string.match(/([A-Z]+)/g);    

    // check for matches.
    if( result != null && result.length ) {
      // remove first element of match result (which returns the original string.
      result.unshift();
      // join the array into a string with an empty "separator".
      response = result.join('');
    }
 
    console.log(response);      

    return response;

}

onlyCapitalLetters("Amazing") // "A"
onlyCapitalLetters("nothing") // ""
onlyCapitalLetters("EVERYTHING") // "EVERYTHING"
onlyCapitalLetters('TbRnY OnUmT'); // "TRYOUT"
0 голосов
/ 16 января 2019

Что касается вашей попытки, вы были почти там! Ваши ошибки были:

  • toUpperCase должно быть toUpperCase(), так как это метод, который должен применяться
  • удалить пустой блок {}; это предотвратит выполнение следующего оператора, только если оператор if имеет значение true; Вы также можете переместить объединение в блок {}

Модифицированная версия ниже:

function onlyCapital(string) {
  var newString = '';
  for (i = 0; i < string.length; i++) {
    if (string[i] === string[i].toUpperCase())
      newString += string[i];
  }
  return newString;
}

console.log(onlyCapital("nothing"));
console.log(onlyCapital("TesT"));
console.log(onlyCapital("TbRnY OnUmT"));

Однако, это не будет работать для строки типа "abc # @", так как применение toUpperCase() к специальному символу вернет тот же символ, и оператор if будет истинным, что приведет к объединению. Вот почему они использовали charCodeAt(0). Эта функция в javascript возвращает целое число от 0 до 65535, представляющее кодовую единицу UTF-16 по данному индексу. Для символов ASCII это означает, что он вернет число от 0 до 127. Что мы можем сделать с этим номером? Мы можем сравнить его с другими числами (взгляните на таблицу ASCII здесь ) и проверить, является ли она действительной буквой или нет. Глядя в эту таблицу, мы видим, что:

  • А - 65
  • Z составляет 90
  • а составляет 97
  • z составляет 122

С помощью приведенной выше информации мы можем создать другую функцию с именем isLetter, которая будет проверять, является ли данный символ допустимой буквой или нет. Как? Проверка, находится ли код нашего символа между A и Z или a и z. Но, так как в любом случае нам не нужны меньшие буквы, мы можем просто проверить [A, Z]. Комбинируя это с кодом выше, мы получим это:

function isUppercaseLetter(c) {
  return (c.charCodeAt(0) >= 65 && c.charCodeAt(0) <= 90)
}

function onlyCapital(string) {
  var newString = '';
  for (i = 0; i < string.length; i++) {
    if (isUppercaseLetter(string[i])) {
      newString += string[i];
    }
  }
  return newString;
}

console.log(onlyCapital("nothing"));
console.log(onlyCapital("EVERYTHING"));
console.log(onlyCapital("TbRnY OnUmT"));
console.log(onlyCapital("S@P#E!C#I?A;L"));

Бонус:

Я сделаю это с помощью filter лямбда-функции. Сначала мы конвертируем строку в массив символов, а затем сохраняем только символы в верхнем регистре. Вы можете узнать больше о том, как работает Reduce здесь . Другой метод с использованием функционалов был бы с reduce. Вы можете посмотреть, как работает Reduce здесь . Обычно я использую split, чтобы превратить строку в массив символов, затем для каждого символа я либо добавляю его к частичному результату, либо просто сохраняю частичный результат. В конце концов, у меня должна быть моя строка.

function isUppercaseLetter(c) {
  return (c.charCodeAt(0) >= 65 && c.charCodeAt(0) <= 90);
}

function onlyCapitalWithFilter(s) {
  return s.split('').filter(c => isUppercaseLetter(c)).join('');
}

function onlyCapitalWithReduce(s) {
  return s.split('').reduce((a, c) => isUppercaseLetter(c) ? a + c : a, '');
}

console.log(onlyCapitalWithFilter("nothing"));
console.log(onlyCapitalWithFilter("TesT"));
console.log(onlyCapitalWithFilter("TbRnY OnUmT"));
console.log(onlyCapitalWithFilter("S@P#E!C#I?A;L"));

console.log(onlyCapitalWithReduce("nothing"));
console.log(onlyCapitalWithReduce("TesT"));
console.log(onlyCapitalWithReduce("TbRnY OnUmT"));
console.log(onlyCapitalWithReduce("S@P#E!C#I?A;L"));
0 голосов
/ 16 января 2019

Я сделаю это, используя regex.

/[A-Z]/g соответствует всем заглавным буквам.

join('') преобразовать массив совпадающих символов обратно в строку.

function onlyCapitalLetters(input){
  let op = input.match(/[A-Z]/g) || ''
  if(op) op = op.join('')
  console.log(op)
}


onlyCapitalLetters("Amazing") // "A"
onlyCapitalLetters("nothing") // ""
onlyCapitalLetters("EVERYTHING") 
onlyCapitalLetters('TbRnY OnUmT');
...