链接逻辑运算符会在javaScript中产生错误的结果

时间:2015-07-17 09:25:52

标签: javascript if-statement logical-operators

我试图在网络应用程序中应用医疗分数。搜索功能并没有给我带来满意的结果 分数的一部分不是数学上的,而是仅仅逻辑确定。 它需要三个变量来检查和评分这些值。

评分的作用如下:

Score        Grades
0    <--     All 0
1    <--     At least one 1, but no >1
2    <--     2 in only one region       (respectively the variable)
3    <--     2 in more than one region  (respectively the variable)
4    <--     3 in one or more region    (respectively the variable)
5    <--     4 in only one region       (respectively the variable)
6    <--     4 in more than one region  (respectively the variable)

去年我开发了一个功能齐全的Python脚本,但我想通过javaScript将这个分数实现到Web应用程序中。 我想出了一个计数功能 - 计算某个数字出现的次数。

arr = [];
var a = 2;
var b = 4;
var c = 0;
arr.push(a, b, c);
function countThis(numberToCount) {
    count = 0;
    for (var i in arr) {
        if (arr[i] == numberToCount) {
            count++;
        }
    }
}

这些线似乎有效。但是现在出现了让我烦恼的部分 我设置了一系列条件 - 所有条件都链接并与上面的函数结合 - 来计算分数。

function scoreArr() {
    score = 0;
    if (a === 0 && b === 0 && c === 0) {
        score = 0;
    } else if (a <= 1 && b <= 1 && c <= 1 && countThis(1) >= 1) {
        score = 1;
    } else if (a <= 4 || b <= 4 || c <= 4 && countThis(4) >= 2) {
        score = 6;
    } else if (a <= 4 || b <= 4 || c <= 4 && countThis(4) == 1) {
        score = 5;
    } else if (a <= 3 || b <= 3 || c <= 3 && countThis(3) >= 1) {
        score = 4;
    } else if (a <= 2 || b <= 2 || c <= 2 && countThis(2) > 1) {
        score = 3;
    } else if (a <= 2 || b <= 2 || c <= 2 && countThis(2) == 1) {
        score = 2;
    }
    return score;
}

a = 0, b = 0, c = 0得出0的正确分数。 但是对于其他所有可能的组合(数字0到4),我得到完全相同的结果:6。这显然是错误

我试图改变运算符,添加括号,但是没有任何东西能使它工作。 我认为问题在我的条件下是隐藏的(?),但我不知道如何解决它。

这是JSFIDDLE

我必须承认,我对javaScript编码很陌生。所以如果有人能向我解释我做错了什么,我将非常感激。

非常感谢你的时间。

2 个答案:

答案 0 :(得分:1)

我相信你的一个问题是你的函数countThis(numberToCount)没有return语句,所以返回undefined

只需添加return count;即可解决问题。

function countThis(numberToCount) {
    var count = 0;
    for (var i in arr) {
        if (arr[i] == numberToCount) {
            count++;
        }
    }
    return count;
}

如果你做了if阻止反过来,从6-0检查,每个if语句需要一次比较,它也会使你的代码更清晰,更不容易出错。这就是你以前出错的地方,只需要一点点的重新安排和规划就可以提供帮助:

function scoreArr() {
    var score = 0;
    if (countThis(4)>1) {
        score = 6;
    } else if (countThis(4)==1) {
        score = 5;
    } else if (countThis(3)>=1) {
        score = 4;
    } else if (countThis(2)>1) {
        score = 3;
    } else if (countThis(2)==1) {
        score = 2;
    } else if (countThis(1)>=1) {
        score = 1;
    } else {
        score = 0;
    }
    return score;
}

我制作了一个jsFiddle,你可以看到结果:https://jsfiddle.net/Daniel300/evLqzuvs/5/

修改

再看一下你的代码,我意识到你可能还想看看其他一些问题:

如果您希望您的函数正常工作,您应该在函数内声明您正在使用的所有变量,并返回您需要的函数。

而不是:

addOne(1);
function addOne(num) {
  result=num+1;
}
alert(result);

尝试:

function addOne(num) {
  var result = num + 1; //Local variable, keeps it inside the function only.
  return result; //Returns only what you need
}
alert(addOne(1)); //MUCH simpler :)

//alert(result); would give undefined

答案 1 :(得分:0)

获得分数6的可能原因是:

您已添加条件

说第1组

} else if (a <= 4 || b <= 4 || c <= 4 && countThis(4) >= 2) {
    score = 6;
} else if (a <= 4 || b <= 4 || c <= 4 && countThis(4) == 1) {
    score = 5;

之前

说第2组

} else if (a <= 3 || b <= 3 || c <= 3 && countThis(3) >= 1) {
    score = 4;
} else if (a <= 2 || b <= 2 || c <= 2 && countThis(2) > 1) {
    score = 3;
} else if (a <= 2 || b <= 2 || c <= 2 && countThis(2) == 1) {
    score = 2;

无论a的价值有多小,第1组的条件都将首先执行,第2组将永远不会获得执行事件a = 1 or 2 or 3因为这些值满足条件a <= 4

要解决此问题,您需要将条件移至

function scoreArr() {
    score = 0;
    if (a === 0 && b === 0 && c === 0) {
        score = 0;
    } else if (a <= 1 && b <= 1 && c <= 1 && countThis(1) >= 1) {
        score = 1;
    } else if (a <= 2 || b <= 2 || c <= 2 && countThis(2) == 1) {
        score = 2;
    } else if (a <= 2 || b <= 2 || c <= 2 && countThis(2) > 1) {
        score = 3;
    } else if (a <= 3 || b <= 3 || c <= 3 && countThis(3) >= 1) {
        score = 4;
    } else if (a <= 4 || b <= 4 || c <= 4 && countThis(4) == 1) {
        score = 5;
    } else if (a <= 4 || b <= 4 || c <= 4 && countThis(4) >= 2) {
        score = 6;
    }
    return score;
}

这是您更新的Fiddle