Подсчет слов в строке — camelCase

Учитывая s, выведите количество слов в новой строке. Например, s = oneTwoThree . В строке 3 слова.

Я знаю, что нахожу заглавные буквы, но не уверен, правильно ли считаю слова.

Что мне не хватает?

Ввод

сохранить изменения в редакторе

Вывод

5

Сейчас у меня 0.

function camelCase(s) {

   let count = 0;

   for(let i of s){

    if(s.charAt(i) === s.charAt(i).toUpperCase()){

      count++

    }
   }
   return count
}

person and1    schedule 11.03.2020    source источник
comment
Если исходное длинное слово на 100% состоит из верблюжьего регистра (вы уверены), то просто посчитайте заглавные буквы и прибавьте 1, это даст количество коротких слов.   -  person dajnz    schedule 11.03.2020


Ответы (3)


Я вижу только две проблемы. Вы хотите let i in s, а не let i of s. (Первый дает вам индекс, тогда как последний дает вам фактическую букву в этой позиции).

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

function camelcase(s) {
   let count = 1;
   for(let i in s){
    if(s.charAt(i) === s.charAt(i).toUpperCase()){
      count++
    }
   }
   return count
}

console.log(camelcase("oneTwoThree"));

Если это проблема кодирования, вы можете захотеть учесть крайние случаи. Например, каким должен быть ответ для пустой строки? Должны ли вы тестировать явно для этого? Будут ли во входной строке пробелы, цифры или специальные символы? Это может быть проблемой с этой текущей логикой.

person Nick    schedule 11.03.2020
comment
ценю это и хороший вызов в крайних случаях, хотя я только что запустил вашу функцию в 18 тестовых случаях, и она прошла все из них. - person and1; 11.03.2020
comment
это не цикл for-in для объектов или это и строки, и объекты? - person and1; 11.03.2020
comment
Я считаю, что это работает для любых итераций, включая строки - person Nick; 11.03.2020
comment
Я не знаю об этой рекомендации? - person Nick; 11.03.2020
comment
@Nick для массивов возвращает индексы, поэтому не очень полезно. для из лучше. - person QuentinUK; 11.03.2020
comment
for(let c of s) if('A'‹=c && c‹='Z') count++ - person QuentinUK; 11.03.2020

Вы считаете заглавные буквы char, а строка oneTwoThree содержит только две заглавные буквы. Таким образом, на выходе будет 2.

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

const s = 'oneTwoThree';

console.log(s.split(/(?=[A-Z])/g).length);

person random    schedule 11.03.2020

Вы можете использовать регулярное выражение, чтобы заменить все алфавиты lower case, а затем подсчитать оставшиеся.

let string1 = "saveChangesInTheEditor";
let string2 = "oneTwoThree";
//For empty Strings
let string3 = "";

function camelcase(s) {
  return (s ? (s.trim().replace(/[^A-Z]/g, "").length + 1) : 0);
}

console.log(camelcase(string1));
console.log(camelcase(string2));
console.log(camelcase(string3));

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

let arr = ["saveChangesInTheEditor", "oneTwoThree", ""]

function camelcase(s) {
  if (Array.isArray(s)) {
    let camelCase = [];
    for (const string of s) {
      camelCase.push((string ? (string.trim().replace(/[^A-Z]/g, "").length + 1) : 0));
    }
    return camelCase;
  } else {
    return (s ? (s.trim().replace(/[^A-Z]/g, "").length + 1) : 0);
  }
}

console.log(camelcase(arr));

person Sohail Ashraf    schedule 11.03.2020