在 switch Javascript 大小写中使用字符串“includes()”

问题描述 投票:0回答:6

在Javascript中,有没有办法实现类似的东西?

const databaseObjectID = "someId"; // like "product/217637"

switch(databaseObjectID) {
    case includes('product'): actionOnProduct(databaseObjectID); break;
    case includes('user'): actionOnUser(databaseObjectID); break;
    // .. a long list of different object types
}

这更是一个了解 switch / case 可能性的好奇问题,因为在这种特殊情况下,我已经使用

const type = databaseObjectID.split('/')[0];
解决了我的问题,并将 switch case 应用于
type

javascript switch-statement
6个回答
28
投票

这会起作用,但不应该在实践中使用。

const databaseObjectID = "someId"; // like "product/217637"

switch(true) {
    case databaseObjectID.includes('product'): actionOnProduct(databaseObjectID); break;
    case databaseObjectID.includes('user'): actionOnUser(databaseObjectID); break;
    // .. a long list of different object types
}

21
投票

您的使用将被视为滥用案例。

只需使用 if

     if (databaseObjectId.includes('product')) actionOnProduct(databaseObjectID); 
else if (databaseObjectId.includes('user'))    actionOnUser(databaseObjectID); 
// .. a long list of different object types

如果ObjectId包含产品或用户周围的静态内容,您可以将其删除并使用用户或产品作为密钥:

var actions = {
  "product":actionOnProduct,
  "user"   :actionOnUser
}

actions[databaseObjectId.replace(/..../,"")](databaseObjectId);

17
投票

抱歉,我是个菜鸟,所以可能需要有人来清理它,但这就是想法。 传递给函数来检查并返回类别,然后使用开关。

function classify(string){
  var category = categorize(string);
  switch (category) {
    case 'product':
      console.log('this is a product');
      break;
    case 'user':
      console.log('this is a user');
      break;
    default:
      console.log('category undefined');    
  }
}

function categorize(string){
  if (string.includes('product')){
    return 'product';
  }
  if (string.includes('user')){
    return 'user';
  }
}

classify("product789");
classify("user123");
classify("test567");

也很抱歉,与您的示例不匹配。


6
投票

问题:

在 switch Javascript 案例中使用字符串“includes()”

虽然

includes()
方法可以工作,但它区分大小写,并且只匹配任何字符。 我找到了一个我更喜欢的正则表达式解决方案,并且提供了很大的灵活性。 例如,您可以轻松地将其更改为仅匹配单词。

var sourceStr = 'Some Text and literaltextforcase2 and more text'

switch (true)  {  // sourceStr

  case (/LiteralTextForCase1/i.test(sourceStr)):
      console.log('Case 1');
      break;

  case (/LiteralTextForCase2/i.test(sourceStr)):
    console.log('Case 2');
    break;

  default:
      console.log('ERROR No Case provided for: ' + sourceStr);
};

//-->Case 2


1
投票

这是一个很晚的答案,但这是我使用的:

const valueToCheck = 'abc';

const caseMap = {
    'a': console.log('a'),
    'b': console.log('b'),
}

Object.keys(caseMap).forEach(val => {
    if(valueToCheck.includes(val)) {
        caseMap[val];
    }
})

0
投票

我用:

function classify(string){
  if (string.includes("case 1")) return "Case 1"
  if (string.includes("case 2")) return "Case 2"
  //...
}
switch (classify(string)) {
  case "Case 1":
    //...
    break;
  case "Case 2":
    //..
  default:
    break;
}

你可能会想:但是如果我需要使用

if
子句,那还有什么意义呢?我认为这有助于使
switch
的声明更加清晰。另外,当代码增长时,您可能需要在其他地方重用
classify
函数。

© www.soinside.com 2019 - 2024. All rights reserved.