尝试将某些非常重复的代码重写为某种循环,并且弄清楚逻辑会在某种程度上煎炸我的大脑。
原始代码看起来有点像这样:
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
}
}
}
}
}
我知道这不对,但任何人都可以帮我解释逻辑应该是什么吗?
由于
修改
应澄清变量所指的内容。
使用行doCheck(this.value, 'foo1')
从onblur事件的元素内联调用此函数(此示例仅涉及第一个实例,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
变量是字段名称。
答案 0 :(得分:2)
您可以生成可能字段列表,从该列表中删除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
}
}
答案 1 :(得分:0)
我认为你的问题应该在这里:
if($('#fieldNames[j]').val() == a){
Repalce with:
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
}
}
答案 2 :(得分:0)
我不确定您希望//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
}