Тройное условие для if {} else if {if {} else {}} - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу изменить все операторы if else на троичный оператор. Что такое троичный оператор для этих if else операторов?

  const compareHands = (playerChoice, computerChoice) => {
        // Update Text
        const winner = document.querySelector('.winner');
        const winnerIs = (who, isPlayerWin) => {

            winner.textContent = `${who} Wins!`;

            isPlayerWin ? pScore++ : cScore++;

            updateScore();
        };



        // Check for tie
        if (playerChoice === computerChoice) {
            winner.textContent = 'It Is A Tie!';
            // Check For Winner
        } else if (playerChoice === 'rock') {
            if (computerChoice === 'scissors') {
                winnerIs('Player', true);
            } else {
                winnerIs('Computer', false);
            }
        } else if (playerChoice === 'paper') {
            if (computerChoice === 'scissors') {
                winnerIs('Computer', false);
            } else {
                winnerIs('Player', true);
            }
        } else if (playerChoice === 'scissors') {
            if (computerChoice === 'rock') {
                winnerIs('Computer', false);
            } else {
                winnerIs('Player', true);
            }
        }
    }

Ответы [ 5 ]

1 голос
/ 11 апреля 2019

Как говорит Нина Шольц, я бы тоже не использовал.Я знаю, что это не отвечает буквальному вопросу, но как насчет этого?

const loser_to = {
  paper: 'rock',
  rock: 'scissors',
  scissors: 'paper'
};

if (loser_to[playerChoice] === computerChoice) {
  // player wins
} else if (loser_to[computerChoice] === playerChoice) {
  // computer wins
} else {
  // noone wins
}
1 голос
/ 11 апреля 2019

Честно говоря, я не думаю, что использование троичного оператора сделает код лучше.Я предлагаю вам попытаться сократить цепочку if-else путем создания структуры данных для удобного поиска, что-то вроде этого:


const whatBeats = {
  'scissors': 'rock',
  'paper': 'scissors',
  'rock': 'paper'
};
const compareHands = (playerChoice, computerChoice) => {
  // Update Text
  const winner = document.querySelector('.winner');
  const winnerIs = (who, isPlayerWin) => {

    winner.textContent = `${who} Wins!`;

    isPlayerWin ? pScore++ : cScore++;

    updateScore();
  };

  // Check for tie
  if (playerChoice === computerChoice) {
    winner.textContent = 'It Is A Tie!';
    // Check For Winner
  } else if (playerChoice === whatBeats[computerChoice]) {
    winnerIs('Player', true);
  } else {
    winnerIs('Computer', false)
  }
}

В этом случае мы рассматриваем динамику игры как данные, централизуя еев одном месте.

Для следующих вопросов попробуйте решить проблему раньше (существует множество учебников по троичным операторам).

0 голосов
/ 11 апреля 2019

Если вы хотите гораздо более сухой код.Вы можете попробовать это решение, чтобы избежать многократного вызова функции winnerIs.

const compareHands = (playerChoice, computerChoice) => {
  const winner = document.querySelector('.winner');

  if (playerChoice == computerChoice) {
    winner.textContent = 'It Is A Tie!';
    return;
  }

  let choices = ['rock', 'paper', 'scissor'];
  let playerIndex, computerIndex, isPlayerWin;

  playerIndex = choices.indexOf(playerChoice);
  choices.push(choices.shift());
  computerIndex = choices.indexOf(computerChoice);
  isPlayerWin = playerIndex !== computerIndex;

  winner.textContent = `${isPlayerWin ? 'Player' : 'Computer'} Wins!`;
  isPlayerWin ? pScore++ : cScore++;
  updateScore();
}
0 голосов
/ 11 апреля 2019

Использование слишком большого числа троичных символов может привести к нечитаемому коду.Я предлагаю вам использовать комбинацию переключателей с троичными операторами.

switch (playerChoice) {
   case computerChoice: winner.textContent = 'It Is A Tie!';break;
   case 'rock': computerChoice === 'scissors' ?  winnerIs('Player', true) : winnerIs('Computer', false); break;
   case 'paper': computerChoice === 'rock' ?  winnerIs('Player', true) : winnerIs('Computer', false); break;
   case 'scissors': computerChoice === 'paper' ?  winnerIs('Player', true) : winnerIs('Computer', false); break;
    }
0 голосов
/ 11 апреля 2019

Попробуй вот так.Хотя удобочитаемость является проблемой, поскольку существует слишком много вложенных if else, которые заменяются троичными операторами.true & false заменены на !0 & !1 соответственно для сокращения оператора

playerChoice === computerChoice ?
  winner.textContent = "It Is A Tie!" :
  "rock" === playerChoice ?
  "scissors" === computerChoice ?
  winnerIs("Player", !0) :
  winnerIs("Computer", !1) :
  "paper" === playerChoice ?
  "scissors" === computerChoice ?
  winnerIs("Computer", !1) :
  winnerIs("Player", !0) :
  "scissors" === playerChoice && ("rock" === computerChoice ? winnerIs("Computer", !1) :
    winnerIs("Player", !0));
...