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

时间:2019-05-03 03:01:52

标签: javascript

我是JS的新手,并且在使用此特定代码时遇到了一些麻烦。使用switch语句应该是石头,剪刀,剪刀,但是它没有返回绘制值,并且返回了其他错误的值:

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 个答案:

答案 0 :(得分:2)

以下是您的代码错误。

  • 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'))