У меня есть интересный подход, который вы можете попробовать, который использует цикл for и только один оператор if.
Вы можете использовать литералы объекта для установки значений каждого состояния:
const stateConditions = {
"isRock": {
"paper": "You lose!",
"scissors": "You win!",
"rock": "Draw!"
},
"isPaper": {
"rock": "You win!",
"scissors": "You lose!",
"paper": "Draw!"
},
"isScissors": {
"rock": "You lose!",
"paper": "You win!",
"scissors": "Draw!"
}
};
В приведенном выше объекте, если вы сделали state = stateConditions ['isRock'], вы получите соответствующие условия для rock
С javascript this.state ['isRock'] совпадает с this.state.isRock. И вы можете использовать свойство для зацикливания каждого свойства в объекте, используя forin , таким образом, вы можете сделать следующее, чтобы найти текущее состояние. Таким образом, вы можете перебрать все возможные состояния и посмотреть, истинно ли this.state ['somestate']:
for (let state in stateConditions) {
if (this.state[state] === true) {
// you found which state was true!
}
}
Финальный код:
const conditions = {
"isRock": {
"paper": "You lose!",
"scissors": "You win!",
"rock": "Draw!"
},
"isPaper": {
"rock": "You win!",
"scissors": "You lose!",
"paper": "Draw!"
},
"isScissors": {
"rock": "You lose!",
"paper": "You win!",
"scissors": "Draw!"
}
};
for (const state in conditions) {
// check if this is the state
if (this.state[state]) {
this.setState({ result: condition[state][this.state.enemy] });
break;
}
}
Вот интересная статья о замене операторов switch на литералы объекта