Javascript регистр нечувствителен при сравнении буквы в слове - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть это упражнение, где пользователь вводит слово, затем вводит букву, чтобы увидеть, сколько раз эта буква встречается в этом слове.Эта часть проекта работает просто отлично.Тем не менее, я хочу сделать это без учета регистра, поскольку сейчас это не так.Я подумал, что можно создать переменную для верхнего и нижнего регистра, а затем сравнить обе эти переменные с i или с переменной letter.Однако счетчик удваивает количество букв в слове.Кто-нибудь может мне помочь?Вот мой код:

function checkWordAndLetter() {
  var userWord = $("#word").val();
  console.log(userWord);
  var userLetter = $("#letter").val();
  console.log(userLetter);
  var letterUpperCase = userLetter.toUpperCase();
  var letterLowerCase = userLetter.toLowerCase();
  var tally = 0;
  for (i = 0; i < userWord.length; i++) {
    if (userLetter == userWord[i] && i == letterUpperCase ||
      letterLowerCase) {
      tally++;
    }
  }
  console.log(tally);
  $("#letterResults").html(" There are " + tally + " " + userLetter + "'s  in the word " + userWord);
  console.log("apple");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="mainPage">
  <h2>Find the Letter in the Word</h2>
  <h4>Enter a word and select a letter to see how many times that letter appears in the word</h2>
    <p>Enter below:</p>
    <br/> Word:
    <input id="word" type="text" name="word"><br/><br/> Letter: <input id="letter" type="text" name="letter"><br/><br/>
    <br/>
    <br/>
    <button id="submit" type="button" name="submit" onclick="checkWordAndLetter()">submit</button>
    <p id="letterResults"></p>
</div>

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Преобразуйте слово в нижний регистр и используйте строчную букву для проверки.Вам не нужно делать uppercase === letter || lowercase === letter.Другой проблемой является ваше заявление if, как уже указывали другие.

Вы также можете использовать RegExp для этого в одной строке:

const letter = 'a'
const word = 'pizza potatoes and hamburgers'
const reg = new RegExp(letter, 'gi')
const count = (word.match(reg) || []).length // 4, 0 if no letters found
0 голосов
/ 06 сентября 2018

Если вы хотите посчитать, сколько букв встречается в слове без учета регистра, перед вводом слова в регистр введите слова и .Таким образом, вы будете сравнивать одни и те же буквы.Пример:

let tally = 0;
let letter = "a";
let word = "cAaatttt";
word = word.toLowerCase();
letter = letter.toLowerCase();
for (let i = 0; i < word.length; i++) {
    if (word[i] === letter) tally++;
}
0 голосов
/ 06 сентября 2018

Чтобы сделать то, что вам требуется с вашим текущим кодом, это преобразовать как слово, так и строку букв в соответствующие регистры, а затем выполнить сравнение. Для этого вы можете использовать toLowerCase() или toUpperCase().

Однако вы можете упростить код еще больше, если создадите регулярное выражение и используйте флаг нечувствительности к регистру (i) вместе с match(), например:

$('#submit').click(function() {
  var userWord = $("#word").val();
  var userLetter = $("#letter").val();
  
  var re = new RegExp(userLetter, 'gi');
  var tally = userWord.match(re).length;
  
  $("#letterResults").html(`There are ${tally} ${userLetter}'s  in the word ${userWord}`);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="mainPage">
  Word: <input id="word" type="text" name="word"><br/><br/> 
  Letter: <input id="letter" type="text" name="letter"><br/><br/>
  <button id="submit" type="button" name="submit">submit</button>
  <p id="letterResults"></p>
</div>

Также обратите внимание на использование ненавязчивого обработчика событий здесь вместо устаревшего атрибута on*, который вам следует избегать.

0 голосов
/ 06 сентября 2018

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

function checkWordAndLetter() {
  var userWord = $("#word").val();
  var userLetter = $("#letter").val();
  var userWordUpper = userWord.toUpperCase();
  var userLetterUpper = userLetter.toUpperCase();
  var tally = 0;
  for (var i = 0; i < userWord.length; i++) {
    if (userLetterUpper == userWordUpper[i]) {
      tally++;
    }
  }
  $("#letterResults").html(" There are " + tally + " " + userLetter + "'s in the word " + userWord);
}
$("#word,#letter").change(checkWordAndLetter)

checkWordAndLetter();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' id='word' value='hello'/>
<input type='text' id='letter' value='l' />
<div id='letterResults'></div>

В вашем исходном коде эта строка:

if (userLetter == userWord[i] && i == letterUpperCase || letterLowerCase) {

могло бы быть:

if (letterUpperCase == userWord[i] || letterLowerCase == userWord[i]) {

Другой вариант может заключаться в использовании .split(), который разделяет строку на массив путем разбиения на указанный символ. Обычно это будет ,, но вы можете использовать любую букву:

var tally = userWordUpper.split(userLetterUpper).length - 1;

function checkWordAndLetter() {
  var userWord = $("#word").val();
  var userLetter = $("#letter").val();

  var userWordUpper = userWord.toUpperCase();
  var userLetterUpper = userLetter.toUpperCase();

  var tally = userWordUpper.split(userLetterUpper).length - 1;

  $("#letterResults").html(" There are " + tally + " " + userLetter + "'s in the word " + userWord);
}
$("#word,#letter").change(checkWordAndLetter)

checkWordAndLetter();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' id='word' value='hello' />
<input type='text' id='letter' value='l' />
<div id='letterResults'></div>

Еще одним вариантом будет использование регулярного выражения (правка: см. Ответ Рори, повторять здесь не нужно) - преимущество регулярного выражения заключается в том, что вам не нужно сначала переходить в верхний / нижний регистр.

...