我正在尝试通过减少重复次数来改进我的代码。
在这里的代码中,我想避免这个切换步骤,因为除了比较运算符===
和!==
之外,不同的情况是相同的。
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;
}
}
请毫不犹豫地提出可以帮助我的解决方案。
这只是众多案例中的一个! 当我认为我的代码本来可以写得更好时,我如何寻求帮助来改进我的代码?
感谢您的帮助。
最佳答案
您可以使用接收参数的函数,该参数描述应如何处理相等性。这里我们可以利用位运算来给出想要的描述。
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
将被强制转换为数字 1
,而 false
将被转换为 0
。所以我们有四种可能的结果:
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
关于Javascript 改进代码 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46057426/