2017-09-05 62 views
2

我试图通过减少重复次数来改进我的代码。Javascript改进代码切换语句

在这里的代码中,我想避免这个切换步骤,因为除了比较运算符===!==之外的不同情况是相同的。

function Test(step, nb_change, name, value, previous_name){ 
    switch (step) { 
     case 1: 
      for (var i = 0; i < nb_change; i++) { 
       if (name === previous_name[nb_change-1-i][1] && value === 'nd') { 
        To_change(i); 
        return true; 
       } 
      } 
      return false; 
     case 2: 
      for (var i = 0; i < nb_change; i++) { 
       if (name === previous_name[nb_change-1-i][1] && value !== 'nd') { 
        To_change(i); 
        return true; 
       } 
      } 
      return false; 
     case 3: 
      for (var i = 0; i < nb_change; i++) { 
       if (select_name !== previous_name[nb_change-1-i][1] && value !== 'nd') { 
        To_change(i); 
        return true; 
       } 
      } 
      return false; 
     default: 
      alert('ERROR'); 
      break; 
    } 
} 

不要犹豫,提出一个解决方案,可以帮助我。

这只是一个很多案例! 当我猜想它可能写得更好时,我如何才能找到帮助来改进我的代码?

谢谢你的帮助。

+6

https://codereview.stackexchange.com/ – j08691

+0

看每种情况下的每个体。弄清楚每种情况都是一样的,有什么不同。使相似的部分成为函数的主体,并为函数创建不同的部分参数。这是泛化代码的基本方法。 – Carcigenicate

+0

@ j08691我不知道这是一件很酷的事。 – jcollum

回答

1

您可以使用接收描述应该如何处理相等性的参数的函数。在这里我们可以利用按位操作来给出所需的描述。

function Test(step, nb_change, name, value, previous_name) { 
    const BOTH_EQ = 3; 
    const NAME_EQ = 2; 
    const NO_EQ = 0; 

    switch (step) { 
     case 1: 
      return myFunc(BOTH_EQ, nb_change, name, previous_name, value); 
     case 2:   
      return myFunc(NAME_EQ, nb_change, name, previous_name, value); 
     case 3:   
      return myFunc(NO_EQ, nb_change, name, previous_name, value) 
     default: 
      alert('ERROR'); 
      break; 
    } 
} 

function myFunc(compare, nb_change, name, previous_name, value) { 
    for (var i = 0; i < nb_change; i++) { 
     const first_eq = (name === previous_name[nb_change-1-i][1]) << 1; 
     const second_eq = value === 'nd'; 

     if (compare === (first_eq | second_eq)) { 
      To_change(i); 
      return true; 
     } 
    } 
    return false; 
} 

compare参数被传递命名常量描述的OR荷兰国际集团的第一相等比较的结果(移位一个比特到左)与所述第二相等比较。

这是可行的,因为true将被强制为1false0。所以我们有四种可能的结果:

true, true == ((true << 1) | true) == ((1 << 1) | 1) == (0010 | 0001) == 3 
true, false == ((true << 1) | false) == ((1 << 1) | 0) == (0010 | 0000) == 2 
false, true == ((false << 1) | true) == ((0 << 1) | 1) == (0000 | 0001) == 1 
false, false == ((false << 1) | false) == ((0 << 1) | 0) == (0000 | 0000) == 0 
+0

@JamesThorpe:你说得对,我错过了。将更新。 – spanky

+0

伟大的按位操作!你的例子很好,只是我不需要switch语句,我可以简单地使用const直接代替我的step变量。 – jardindeden

+0

@jardindeden:是的,如果你可以改变'step',这绝对是一种方式。 – spanky

0

也许是这样的。

function Test(step, nb_change, name, value, previous_name){ 
 
    var result = false;  
 
    for (var i = 0; i < nb_change; i++) { 
 
    var result = false; 
 
    switch (step) { 
 
     case 1: 
 
     result = name === previous_name[nb_change-1-i][1] && value === 'nd'; 
 
     break; 
 
     case 2: 
 
     result = name === previous_name[nb_change-1-i][1] && value !== 'nd'; 
 
     break; 
 
     case 3: 
 
     result = name !== previous_name[nb_change-1-i][1] && value !== 'nd' 
 
     break; 
 
    default: 
 
     alert('ERROR'); 
 
     break; 
 
    } 
 

 
    if (result) { 
 
     To_change(i); 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
}

0
function Test(step, nb_change, name, value, previous_name){ 
    var valueCheck, 
     nameCheck; 

    switch (step) { 
     case 1: 
      valueCheck = value === 'nd'; 
      nameCheck = name === previous_name[nb_change-1-i][1]; 
     case 2: 
      valueCheck = value !== 'nd'); 
      nameCheck = name === previous_name[nb_change-1-i][1]; 
     case 3: 
      valueCheck = value !== 'nd'; 
      nameCheck = select_name !== previous_name[nb_change-1-i][1]; 
     default: 
      alert('ERROR'); 
      break; 
    } 

    for (var i = 0; i < nb_change; i++) { 
     if (nameCheck && valueCheck) { 
      To_change(i); 
      return true; 
     } 
    } 
    return false; 
}