Особый случай совпадения строк + замена в Javascript - PullRequest
0 голосов
/ 10 октября 2018

Я обнаружил большое количество постов, в которых обсуждаются методы поиска / замены для строк в массивах, однако все они, похоже, полагаются на «статическую строку» для замены

, то есть:

var str = "Mr Blue has a blue house and a blue car";
var res = str.replace(/blue/g, "red");

Мне нужно найти и заменить проверку на входное событие

var whichKey = (String.fromCharCode(event.keyCode));

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

, чтобы было ясно:

Я играю в «палача»

пользователь нажимает «W» (например) как «угадай»:

secretPuzzleSolution = ['s', 'o', 'l', 'u', 't', 'i', 'o', 'n']
puzzleUserSees = ['_', '_', '_', '_', '_', '_', '_', '_']

W не находится вголоволомка, поэтому они потеряют «попробовать», если они нажмут «S», код проверит secretPuzzleSolution [] на «s» и заменит все «_» в puzzleUserSees [] на «s» в правильных местах и ​​вернет новоеPuzzleUserSees = ['S', '_', '_', '_', '_', '_', '_', '_',] в результате.

Код успешно находитнажатие клавиши в secretPuzzleSolution [], но я пока не могу получить

  1. скопировать позицию из secretPuzzleSolution [] так, чтобы элемент puzzleUserSees [] был изменен в правильной позиции

  2. , чтобы заменить ВСЕ экземпляры нажатия клавиш, а не только первый (если в secretPuzzleSolution есть два элемента 's')], поменяйте обе позиции в правильных позициях в puzzleUserSees []

, что у меня так далеко, оно частично выполняет свою работу, но, как вы можете видеть, явно разбито на числоспособов.Есть идеи?

Вот раздел, с которым я работаю:

document.onkeydown = function(e) {
  var whichKey = (String.fromCharCode(event.keyCode));
  var keyPress = whichKey.toLocaleLowerCase();
  var found = secretPuzzleSolution.find(function(element) {
    var isMatch = secretPuzzleSolution.indexOf(element);
    if (typeof(element) !== 'undefined') {
      puzzleUserSees.splice((isMatch), (isMatch), element);
      remainingMystery--;
    } else {
      guessList.push(keyPress);
      triesLeft--;
    }
    return element === keyPress;
  });

  if (remainingMystery <= 0) {
    document.getElementById('game-display-area').innerHTML = ('YOU WIN!')
  };
  console.log('These guesses were correct: ' + found);
};

Последнее, что я добавлю, это то, что я в школе, так что я уверен, что есть причудливый способсделать это или с помощью jQuery, но должен быть простой способ только с JS, поскольку это все, что я должен знать до сих пор:)

что-то еще, что я пробовал:

      var test_array = (secretPuzzleSolution.indexOf(keyPress) > -1);
      if (test_array === true) {
      console.log(keyPress + ' was found in the puzzle');
      for (i = 0; i < puzzleUserSees.length; i++) {
      if (keyPress === puzzleUserSees[i]) {
      puzzleUserSees.splice([i], keyPress)
      }
      }
      } else {
      triesLeft--;
      guessList.push(keyPress);
      console.log(keyPress + ' was NOT found');
      }

Спасибо!

1 Ответ

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

Вы совершаете классическую ошибку, перебирая массив для поиска чего-либо и рассматривая его как сбой для каждого несоответствующего элемента.См. Поиск отчетов массива «не найден», даже если он найден

Не следует использовать .find(), поскольку он просто возвращает позицию первого совпадения.Вам нужно использовать .each() для цикла по всему массиву.Он получает индекс массива элемента, поэтому вам не нужно использовать .indexOf(), который возвращает только первую позицию и бесполезен, когда для буквы может быть несколько совпадений.

document.onkeydown = function(e) {
  var whichKey = (String.fromCharCode(event.keyCode));
  var keyPress = whichKey.toLocaleLowerCase();
  var found = false;
  secretPuzzleSolution.forEach(function(element, index) {
    if (element == keyPress) {
      found = true;
      puzzleUserSees = keyPress;
      remainingMystery--;
    }
  });
  if (!found) {
    triesLeft--;
  }
  if (remainingMystery <= 0) {
    document.getElementById('game-display-area').innerHTML = ('YOU WIN!')
  };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...