为了账号安全,请及时绑定邮箱和手机立即绑定

使用开关的功能未返回所需值

使用开关的功能未返回所需值

蛊毒传说 2021-05-05 17:46:41
我是JS的新手,并且在使用此特定代码时遇到了一些麻烦。它应该是使用switch语句的Rock,Paper和Scissors,但是它没有返回绘制值,而是返回了其他错误的值:function RPS(ch1, ch2){    switch (ch1, ch2){        case ('r' && 'p') || ('p' && 'r'):            return 'p';            break;        case ('r' && 's') || ('s' && 'r'):            return 'r';            break;        case ('p' && 's') || ('s' && 'p'):            return 's';            break;        default:            return 'draw';    }}console.log(RPS('s', 's'));因此,使用“ s”和“ s”进行测试时,我期望的是“ draw”,但返回的是“ r”。我做错了什么?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

以下是您的代码错误。

  • switch语句不能有两个变量。ch1, ch2将评估为ch2

  • 'r' && 'p'将始终评估为true。因为rp都是真实的价值观。

您可以按照以下步骤进行操作:

  • 创建一个具有键作为返回值的对象p,q,r。它们的值将是要在原始代码中检查的两个值的数组。例如p将有数组['r','p']

  • Object.entries在对象上。并find()在条目上使用。

  • 内部find()将值ch1ch2数组按两种顺序放置,即[ch1,ch2][ch2,ch1]

  • 使用以下命令检查数组中的任何一个是否等于对象的任何值 every()

  • 如果是,则返回密钥,否则返回 'draw'

function RPS(ch1, ch2){

    

    const obj = {

      p:['r','p'],

      r:['r','s'],

      q:['p','s']

    }

    let entry = Object.entries(obj)

                    .find(([k,v]) =>

                        [ch1,ch2].every((x,i) => x === v[i]) || 

                        [ch2,ch1].every((x,i) => x === v[i])

                    )

    return entry ? entry[0] : 'draw';

}


console.log(RPS('s','p'))


查看完整回答
反对 回复 2021-05-20
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信