1

我有以下 if 语句用于比较表中同一列中的 2 行。我多次使用相同的代码块在不同的列上执行相同的计算。

基本上,我想要一个箭头显示一行和下一行之间的值移动,以及值落入的阈值。因此,例如,在我下面的代码中,任何高于 15 的值都应该是一个红色箭头,如果之前的值较低,那么箭头应该指向上方。我稍后在代码中使用从另一个位置调用的图像来渲染箭头,因此 if 语句只为我提供了相应箭头的字符串。

正如我上面所说,我多次使用相同的代码块。奇怪的是,输出对某些变量有效,而对其他变量无效;即使它是替换了变量名的完全相同的代码!它给我的错误是有时没有明显的原因。

我的条件是不是太多了?有没有更有效的方法来做我想做的事情?

任何帮助将不胜感激!

谢谢,卡尔

var Arrow = " ";
if(KPI[0] > KPI[1] && KPI[0] >= 15)
{
    Arrow = "redarrowup.png";
}
else if(KPI[0] < KPI[1] && KPI[0] >= 15)
{
    Arrow = "redarrowdown.png";
}
else if(KPI[0] = KPI[1] && KPI[0] >= 15)
{
    Arrow = "redarrowflat.png";
}
else if(KPI[0] > KPI[1] && KPI[0] >= 10 && KPI[0] < 15)
{
    Arrow = "yellowarrowup.png";
}
else if(KPI[0] < KPI[1] && KPI[0] >= 10 && KPI[0] < 15)
{
    Arrow = "yellowarrowdown.png";
}
else if(KPI[0] = KPI[1] && KPI[0] >= 10 && KPI[0] < 15)
{
    Arrow = "yellowarrowflat.png";
}
else if(KPI[0] > KPI[1] && KPI[0] < 10)
{   
    Arrow = "greenarrowup.png";
}
else if(KPI[0] < KPI[1] && KPI[0] < 10)
{   
    Arrow = "greenarrowdown.png";
}
else
{
    Arrow = "greenarrowflat.png";
}
4

5 回答 5

5

我建议分别表达不同的概念,然后在最后将它们组合起来。像这样:

var arrow;
var movement = "flat";
var band = "green";

if (KPI[0] > KPI[1]) {
    movement = "up";
} else if (KPI[0] < KPI[1]) {
    movement = "down";
}

if (KPI[0] >= 15) {
    band = "red";
} else if (KPI[0] >= 10) {
    band = "yellow";
}

arrow = band + "arrow" + movement + ".png";

您还可以将这些元素中的每一个都推迟到一个函数中,因此您的最后一行将显示为:

arrow = getBand(KPI[0], KPI[1]) + "arrow" + getMovement(KPI[0], KPI[1]) + ".png";

这将更容易在隔离其他逻辑的情况下更改频段。

于 2012-09-12T14:50:19.530 回答
3

我会说:

function direction(val1, val2){
  return val1 < val2 ? "down" : val1 == val2 ? "flat" : "up";
}

function color(val){
  return val >= 15 ? "red" : val >= 10 ? "yellow" : "green";
}

var arrow = color(KPI[0]) +"arrow"+ direction(KPI[0], KPI[1]) +".png";

如果您不理解代码,我总是告诉人们不要复制和粘贴代码。?:你可能对这个位不熟悉。它是一个三元运算符(内联 if)。

如果您需要多个箭头,我建议您也添加一个生成箭头的函数:

function arrow(val1, val2){
  return color(val1) +"arrow"+ direction(val1, val2) +".png";
}

var kpiArrow = arrow(KPI[0], KPI[1]);
于 2012-09-12T14:51:57.960 回答
1

乍一看,我会说你有一个“=”,你需要一个“==”(甚至是“===”)。例如

if(KPI[0] = KPI[1] && KPI[0] >= 15)

应该是

if(KPI[0] == KPI[1] && KPI[0] >= 15)

(或者甚至 === 正如我所说的)。等等。"=" 是一个赋值运算符,它将 KPI[0] 的值设置为 KPI[1] 的值,然后返回该值,因此您实际上是在执行以下操作:

KPI[0] = KPI[1];
if(KPI[1] && KPI[0] >= 15)

我怀疑这是意图。也就是说,正如其他几个人已经说过的那样,有更好的方法来构建代码。

于 2012-09-12T14:50:24.610 回答
0

我认为问题不在于 if 的数量。但是您可以更好地构建代码:

var direction, color;

// set direction

if(KPI[0] > KPI[1])
{
  direction = "up";
}
else if(KPI[0] < KPI[1])
{
  direction = "down";
}
else if(KPI[0] == KPI[1]) // there was an error in this condition, by the way
{
  direction = "flat";
}

// set color

if(KPI[0] >= 15)
{
  color = "red";
}
else if(KPI[0] >= 10 && KPI[0] < 15)
{
  color = "yellow";
}
else if(KPI[0] < 10)
{
  color = "green";
}

var Arrow = color + "arrow" + direction + ".png";
于 2012-09-12T14:48:41.743 回答
0

这个怎么样:

var arrow = "";

if (KPI[0] >= 15) {
   arrow = "redarrow";
}
else if (KPI[0] >= 10) {
   arrow = "yellowarrow";
}
else if (KPI[0] < 10) {
   arrow = "greenarrow";
}

if (KPI[0] < KPI[1]) {
   arrow += "down.png";
}
else if (KPI[0] > KPI[1]) {
   arrow += "up.png";
}
else if (KPI[0] == KPI[1]) {
   arrow += "flat.png";
}
于 2012-09-12T14:48:49.100 回答