通过Javascript中的switch()语句使用数组

时间:2013-07-23 18:26:34

标签: javascript arrays switch-statement

我试图通过Javascript开发简化的扑克游戏。我已经列出了给定玩家可能拥有的所有可能的牌组合,并按照其值排列,如下所示:

switch(sortedHand)
{           
 //Pair
     case [1,1,4,3,2]: sortedHand.push(1,"Pair"); break;
     case [1,1,5,3,2]: sortedHand.push(2,"Pair"); break; 
     case [1,1,5,4,2]: sortedHand.push(3,"Pair"); break;
     case [1,1,5,4,3]: sortedHand.push(4,"Pair"); break;
     case [1,1,6,3,2]: sortedHand.push(5,"Pair"); break;
     case [1,1,6,4,2]: sortedHand.push(6,"Pair"); break;
     case [1,1,6,4,3]: sortedHand.push(7,"Pair"); break;
     case [1,1,6,5,2]: sortedHand.push(8,"Pair"); break;
     case [1,1,6,5,3]: sortedHand.push(9,"Pair"); break;
     case [1,1,6,5,4]: sortedHand.push(10,"Pair"); break;

即使" sortedHand"数组成功存储值(正如我通过console.log看到的那样),switch()语句总是返回默认情况,并且每个人都获得直接刷新。我担心这是我用来声明可能的数组值与整个" sortedHand"进行比较的字面方法的问题,但我不知道更好。是否可以以这种方式使用switch()?

6 个答案:

答案 0 :(得分:20)

您可以尝试switch数组的文本表示。

switch(sortedHand.join(' '))
{           
    //Pair
    case '1 1 4 3 2': sortedHand.push(1,"Pair"); break;
    case '1 1 5 3 2': sortedHand.push(2,"Pair"); break; 
    case '1 1 5 4 2': sortedHand.push(3,"Pair"); break;
    case '1 1 5 4 3': sortedHand.push(4,"Pair"); break;
    // etc.
}

作为直接指定每个案例的替代方法,可能使用对象构建函数调度表并完全摆脱开关。

var dispatch = {};

// Build the table however you'd like, for your application
for (var i = 0; i < 10; i++) {
    (function(i) {
        var hand = ...; // Add your hand logic here
        dispatch[hand] = function() { sortedHand.push(i, "Pair"); };
    })(i);
}

// Execute your routine
dispatch[sortedHand.join(' ')]();

答案 1 :(得分:6)

  

switch()语句始终返回默认大小写

那是因为比较不检查数组内容,而是检查数组对象本身。对象被认为是相同的,因此没有任何东西等于文字实例化的对象。

  

甚至可以以这种方式使用switch()吗?

是的,可以在switch语句中使用对象,但您必须在案例中使用引用。不适用于您的问题。

在你的情况下,我建议使用字符串化:

switch(sortedHand.join())
{           
 //Pair
     case "1,1,4,3,2": sortedHand.push(1,"Pair"); break;
     case "1,1,5,3,2": sortedHand.push(2,"Pair"); break; 
     case "1,1,5,4,2": sortedHand.push(3,"Pair"); break;
     case "1,1,5,4,3": sortedHand.push(4,"Pair"); break;
     case "1,1,6,3,2": sortedHand.push(5,"Pair"); break;
     case "1,1,6,4,2": sortedHand.push(6,"Pair"); break;
     case "1,1,6,4,3": sortedHand.push(7,"Pair"); break;
     case "1,1,6,5,2": sortedHand.push(8,"Pair"); break;
     case "1,1,6,5,3": sortedHand.push(9,"Pair"); break;
     case "1,1,6,5,4": sortedHand.push(10,"Pair"); break;

但我想有一个更好的算术解决方案来检测你所追求的模式。这会更短更快,但我不确定这个片段到底应该做什么。

答案 2 :(得分:1)

这不会像你拥有的那样工作,但是你可以使用sortedHand.join(',')并将它与[1,1,1,2,5].join(',')进行比较,它将比较两个数组,如果它们的内容完全相同则应该为真(Be小心number输入为strings!) 公平地说,我无法想象为什么你会这样设计你的逻辑。即使是简单的纸牌游戏也有数十万种可能的牌。您可以使用underscore.js的集合管理功能做得更好,因为它会更简单,只是更好的做法。

答案 3 :(得分:1)

更快,可能可重用且更灵活的方法是使用对象而不是大小写:

var ok= {
    '1 1 4 3 2':1,
    '1 1 5 3 2':2,
    '1 1 5 4 2':3,
    '1 1 5 4 3':4
}[ sortedHand.join(' ') ] ;
if(ok){ sortedHand.push( ok ,"Pair"); }
当一个输出铰接在一个输入上时,

对象工作得很好。如果你需要在每种情况下做五件事,那么你必须使用大小写,但如果你只需要X转为Y,(1:1),那么以对象形状查找表是理想的。

我认为RegExp可以在这里工作,我在连接4游戏中使用它们来识别连续4个,但上面的逻辑表应该比你描述的更好或更好。

答案 4 :(得分:1)

普通牌组中有5种牌可能有1274种组合。将它们全部列在switch语句中是完全荒谬的。为什么不让一个函数计算任何重复项来检查2,3,4-a-kind然后检查直道? (你的阵列没有显示西装,所以我假设你要把它留下来。)

但如果你真的想这样做,你可以使用一个字符串。字符串与开关一起使用,您甚至可以像数组一样使用它们。例如“123”[0] =='1'。您可以像parseInt一样来回更改用户函数。

答案 5 :(得分:0)

由于没有人建议这样做,请使用for循环并精确计算给定值的卡数。有了这样的功能,您可以调用'cardCount = count(sortedHand,cardNumber)'。当然,遍历所有可能的卡号将为您提供帮助。

由于给定玩家只能拥有1x2、2x2、1x3、1x3 + 1x2、1x4或直线/街道,因此您可以返回所有命中值的数组,这些数组是表示对象数和涉及的cardNumber的数组/对象。因此,[{2,5},{3,6}]可以容纳一整个房子。