嵌套if语句的程序逻辑
Programatic logic for nested if statements
试图将一些重复性很强的代码重写成某种循环,并弄清楚其中的逻辑在一定程度上让我感到头疼。
原始代码看起来有点像这样:
if(a){
if(b == "foo1"){
if($('#foo2').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
//do something here
}
}
}
if(a){
if(b == "foo2"){
if($('#foo1').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
//do something here
}
}
}
if(a){
if(b == "foo3"){
if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo4').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
//do something here
}
}
}
if(a){
if(b == "foo4"){
if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo3').val() == a || $('#foo5').val() == a || $('#foo6').val() == a){
//do something here
}
}
}
if(b == "foo5"){
if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo6').val() == a){
//do something here
}
}
}
if(b == "foo6"){
if($('#foo1').val() == a || $('#foo2').val() == a || $('#foo3').val() == a || $('#foo4').val() == a || $('#foo5').val() == a){
//do something here
}
}
}
我想把它重写成一个(或多个)循环,但我很难把逻辑弄对。
到目前为止,我有这个:
if (a){
for (i=0; i < 6; i++){
var fieldNames =[ "foo1", "foo2", "foo3", "foo4", "foo5", "foo6"]
console.log("i loop "+ fieldNames[i]);
if(b == fieldNames[i]){
for (j = 1; j < fieldNames.length; j++){
if($('#'+fieldNames[j]).val() == a){
//do something here
}
}
}
}
}
我知道这是不对的,但有人能帮我弄清楚逻辑应该是什么吗?
感谢
编辑:
应澄清变量指的是什么。
这个函数是从onblur事件上的一个元素内联调用的,行为doCheck(this.value, 'foo1')
(这个例子只涉及它的第一个实例,b输入是第二个foo2,第三个foo3,依此类推…
完整的功能如下:
function doCheck(a,b)
if (a){
for (i=0; i < 6; i++){
var fieldNames =[ "foo1", "foo2", "foo3", "foo4", "foo5", "foo6"]
console.log("i loop "+ fieldNames[i]);
if(b == fieldNames[i]){
for (j = 1; j < fieldNames.length; j++){
if($('#'+fieldNames[j]).val() == a){
//do something here
}
}
}
}
}
}
因此,变量a
是select元素中的值,而b
变量是字段名。
您可以生成一个可能字段的列表,从该列表中删除b
,然后与其余字段进行比较。
if (a) {
var fieldNames = ['foo1', 'foo2', 'foo3', 'foo4', 'foo5', 'foo6'];
// Remove b from the fields
fieldNames.splice(fieldNames.indexOf(b), 1);
var doSomething = fieldNames.reduce(function(prev, fieldName) {
return prev && $('#' + fieldName).val() === a;
}, true);
if (doSomething) {
// do something
}
}
另一种看待这一问题的方法是这样的:
if (a) {
var fieldNames = ['foo1', 'foo2', 'foo3', 'foo4', 'foo5', 'foo6'];
// Remove b from the fields
fieldNames.splice(fieldNames.indexOf(b), 1);
var doSomething = true;
for (var i = 0; i < fieldNames.length; i++) {
if ($('#' + fieldNames[i]).val() !== a) {
doSomething = false;
break;
}
}
if (doSomething) {
// do something
}
}
我认为你的问题应该在这里:
if($('#fieldNames[j]').val() == a){
使用修复
if($('#' + fieldNames[j]).val() == a){
此外,你的循环可能会像这样更新,
var fieldNames =[ "foo1", "foo2", "foo3", "foo4", "foo5", "foo6"];
// Define fieldNames before the first loop
if (a){
for (i=0; i < fieldNames.length; i++){
console.log("i loop "+ fieldNames[i]);
if(b == fieldNames[i]){
for (j = 1; j < fieldNames.length; j++){ // WHY YOU START AT j=1 ? I shall start at j=0 in my opinion
if($('#fieldNames[j]').val() == a){
//do something here
break; // <=== EXIT 2nd LOOP IF YOU FIND SOMETHING
}
}
}
break; // <=== EXIT 1st LOOP IF YOU FIND SOMETHING
}
}
我不确定您是否希望//do something here
对于原始代码中的所有if块都是相同的。如果你想要相同的,那么你可以按照你的建议进行循环,否则就不行。
为什么不将值(即$('#foo2').val()
)放入数组中,并使用数组上的indexOf()
函数测试a和b?
var fieldValues =[ $("#foo1").val(), $("#foo2").val(), etc];
if(fieldValues.indexOf(a)!=-1 || fieldValues.indexOf(b)!=-1){
//do something here
}
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 如何使用url加载程序在webpack中导入多个图像
- keyup事件处理程序更改焦点不适用于快速键入
- 用程序搜索JQuery数据表中的文本
- 如果 a 为 false,则 if(a) === if(false)
- 通过使用ng if更新ng repeat加载程序
- if-else循环和jquery在热应用程序或冷应用程序中不起作用
- jquery if循环使用引导程序类
- JavaScript if/else 程序未按预期生成警报
- 如何检查我的 chrome 扩展程序的 if 语句中的单词列表
- 设计程序以避免大的if-else块
- 谷歌应用程序脚本条件if语句
- 一些javascript代码不工作-事件处理程序'onclick'中的if()语句
- If条件在我的路由提供程序中
- javascript程序的Else块总是执行,即使If块为真
- 使用条件if退出程序
- 嵌套if语句的程序逻辑
- 使用ko:if-binding敲除绑定提供程序预处理器
- 是否可以在jQuery .scroll()事件处理程序中使用if-else
- Javascript中不进入if条件的程序流