Как реализовать функцию, которая будет возвращать, когда передается интенсивная строка, и false в противном случае? - PullRequest
0 голосов
/ 12 октября 2018

Строки являются интенсивными, если они заканчиваются в три или более!Метки.Однако имея!отмечает где угодно, но конец делает для не интенсивной строки.

Проблема, с которой я сталкиваюсь, это когда есть!в середине строки.Результат должен быть ложным, но он все равно будет иметь значение true.

Мой код:

function intenseString (str) {
  if (str.slice(-3) !== "!!!") {
    return false;
    } 
  else if(str.slice(str.indexOf("!"))){
    return false;
    }
  else if(str.slice(-3) === "!!!"){
    return true
  }
}

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Попробуйте одним из следующих способов:

function intenseString(str) { return str.slice(-3) === '!!!'; }

function intenseString(str) { return str.endsWith('!!!'); }

function intenseString(str) { return /!{3}$/.test(str); }
0 голосов
/ 07 декабря 2018

Вот ваш код с некоторыми настройками форматирования для удобства чтения:

function intenseString(str) {
  if (str.slice(-3) !== '!!!') {
    return false;
  }

  if (str.slice(str.indexOf('!'))) {
    return false;
  }

  if (str.slice(-3) === '!!!') {
    return true;
  }
}

Можете ли вы привести несколько примеров ввода, которые возвращают true?Я не думаю, что это когда-либо вернет true, потому что второе выражение if говорит: "верните false, если в строке есть какие-либо !, что подразумевается при пропуске первого if.

Я полагаю, что вы хотели добавить + 1: if (str.slice(str.indexOf('!') + 1)) return false, который говорит: "верните false, если есть какие-либо !, которые не являются последним символом в строке", что все равно не будет работать: первыйОператор if вернет false, если строка не заканчивается !!!, что означает, что наименьшая строка, которая попадет во второй оператор if, будет !!!, и после первого ! всегда будут символы.

Другой потенциальной попыткой будет проверка только строки перед последними тремя символами if (str.slice(0, -3).slice(str.indexOf('!') + 1)) return false, которая почти работает, за исключением строк, содержащих более 4 ! в самом конце ... (например, * 1023).*).

Я не вижу простого способа (без регулярного выражения проверить, что оставшиеся символы только !), чтобы второй оператор if работал без зацикливания строки.

Обратите внимание, что ваш окончательный if не требуется.Первые два проверяют наличие ошибок, и если они проходят через них, это должна быть интенсивная строка.Также строка должна заканчиваться на !!!, если она прошла после первого if.


Вот потенциальное решение, которое проходит через каждый символ в строке, кроме последних 4,и возвращает false, если когда-либо ! сопровождается чем-то, что не !.

function intenseString(str) {
   if (!str.endsWith('!!!')) {
       return false;
   }

   for (let i = 0; i < str.length - 4; i++) {
       if (str.charAt(i) === '!' && str.charAt(i + 1) !== ('!')) {
           return false;
       }
   }

   return true;
}
0 голосов
/ 12 октября 2018

Используйте indexOf вместо нарезки строки:

const strings = ['abc!!!', 'abc!!de', 'abc!']

const intenseString = (str, chars) => str.indexOf(chars) >= 0

console.log(strings.map(x => intenseString(x, '!!!')))
...