【问题标题】:Array as case in switch case JavaScript数组作为 switch case JavaScript 中的 case
【发布时间】:2021-08-01 18:30:43
【问题描述】:

如何在 switch case 中使用数组作为 case 参数?

switch ("value")
  case ArrayOfStrings // check every array item to be match with value
    ...

【问题讨论】:

  • 您要检查是否传递了特定数组或数组构造函数是否传递?前者在switch 中是不可能的,后者是可能的,但很奇怪。
  • 您能否提供一个更详细的示例来说明您想要实现的目标,例如... 可能是什么?您示例中的 Array 字面意思是 Array 类型,所以您想打开该类型吗?
  • 你有它的用例吗?其他情况呢?
  • 您的交换机的输入是什么?这是一个数组,还是您试图将一个值与一组值匹配?
  • 清洁是相当主观的。我觉得这样很干净。也许您的解决方案是 使用 switch 语句,但您没有提供足够的细节让我们确定这一点。这看起来有点像XY problem

标签: javascript reactjs typescript


【解决方案1】:

没有。

这个

switch ("value") {
  case ArrayOfStrings // check every array item to be match with value
    ...

不起作用,因为switch 的值和case 的值是通过Identity/strict equality operator === 比较来检查的。

无法将值与数组的值进行检查。

任何其他结构,例如

switch (true) {
  case ArrayOfStrings.includes("value"):  // check every array item to be match with value

可以,但如果您只需要检查单个值而不检查其他约束,则最好采取

if (ArrayOfStrings.includes("value")) {
    // ...
}

【讨论】:

    【解决方案2】:

    首先我建议使用ifArray.isArray 之类的东西:

    if (Array.isArray(value)) {
      // check array items
    }
    

    但是,如果您真的想/需要通过与Array 构造函数进行比较来检查:

    const check = (value) => {
      switch (value.constructor) {
        case Array:
          console.log('array');
          break;
    
        // For example
        case Number:
          console.log('number');
          break;
      }
    }
    
    check(7); // 'number'
    check([]); // 'array'
    

    不过,我真的不鼓励使用这种方法。

    【讨论】:

      【解决方案3】:

      理论上,您可以这样做以区分不同的构造函数。

      class ArrayOfStrings extends Array<string> {};
      class ArrayOfNumbers extends Array<number> {};
      
      function main(input: ArrayOfStrings | ArrayOfNumbers): void {
        switch (input.constructor) {
          case ArrayOfStrings:
            console.log('It was an array of strings!');
            break;
          default:
             console.log('It was something else');
        }
      }
      
      main(new ArrayOfStrings('foo', 'bar')); // Logs 'It was an array of strings!'
      main(new ArrayOfNumbers(1, 2)); // Logs 'It was something else'
      

      但是,this method has limitations

      1. 它不适用于子类化。
      2. 对于每个caseinput 将属于同一类型——而不是被歧视。见TypeScript Playground
      3. 您需要使用new 关键字创建数组。

      最好将if 语句与类型保护结合使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 2012-08-14
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        相关资源
        最近更新 更多