Javascript - 如果条件满足则不要比较

时间:2018-04-15 22:11:12

标签: javascript

我的html表格有这个脚本,它逐行着色列中的单元格:

$(document).ready( function () {

        var table, aP, rtvP, mmP, meP;
        table = document.getElementById('productTable');

        for (i = 1; i < table.rows.length; i++) {

            var rowCells = table.rows.item(i).cells;
            if (rowCells[3].firstChild.data !== '—') {
                aP = parseFloat(rowCells[3].firstChild.data);
            } else {
                aP = 0;
            }
            if (rowCells[5].firstChild.data !== '—') {
                rtvP = parseFloat(rowCells[5].firstChild.data);
            } else {
                rtvP = 0;
            }
            if (rowCells[7].firstChild.data !== '—') {
                mmP = parseFloat(rowCells[7].firstChild.data);
            } else {
                mmP = 0;
            }
            if (rowCells[9].firstChild.data !== '—') {
                meP = parseFloat(rowCells[9].firstChild.data);
            } else {
                meP = 0;
            }
            console.log(aP, rtvP, mmP, meP);

            if (aP > rtvP || mmP || meP) {
                rowCells[3].bgColor = 'red';
            } else if (aP === rtvP || mmP || meP) {
                rowCells[3].bgColor = 'yellow';
            } else {
                rowCells[3].bgColor = 'green';

            }


        }

    })

我知道这是一个小怪物,但我唯一想念的是,如果该值= 0,则不应该对值进行比较。如果aP = 100,rtvP = 150,mmP = 0,meP = 50,则应跳过mmP的值进行比较。有没有简单的方法呢?我不想制作另一个IF的意大利面

2 个答案:

答案 0 :(得分:2)

您可以尝试将其中一个实例转换为正确的函数:

function convertP(value) {
   if (value !== '—') {
     return parseFloat(value);
   }

   return 0;
}

然后你可以这样称呼它:

meP = convertP(rowCells[9].firstChild.data);

你可以在哪里增强convertP功能,使其变得更聪明&#34;并在以后处理不同的案件。

现在针对您的比较问题,您可能希望将这些转换后的值存储到数组中,而不是存储为一堆不相关的变量,例如:

var points = [ ];

[ 3, 5, 7, 9 ].forEach(function(i) {
  points.push(convertP(rowCells[i].firstChild.data));
});

现在你把所有这些都放在一个整洁,整洁的容器里。然后,您可以通过执行以下操作来快速比较它们:

var diffs = [ ];
points.forEach(function(p) {
  diffs.push(aP - p);
});

这里要记住的关键是浮点值通常是近似值,因此重要的是不要依赖它们精确相等。 1.0 + 2.0不一定是=== 3.0。由于浮点怪癖会产生很小的偏差,所以即使该值为0.000001,也要使用+/-一些微小的值。

现在,您可以使用以下功能识别颜色条件:

function colorCondition(aP, points) {
  var state = 'green';
  var epsilon = 0.000001;

  points.forEach(function(p) {
    if (aP > (p + epsilon)) {
      state = 'red';
    }
    else if (aP > (p - epsilon)) {
      state = 'yellow';
    }
  });

  return state;
}

现在您有了一个可以使用 N 输入的通用解决方案。当您尝试遵守Zero, One or Infinity Rule时,这是编程的目标。

答案 1 :(得分:1)

如果使用逻辑 AND 运算符,则中的先决条件的一种方法是:&&

对于你的变量,它将是:

if (mmP!=0 && mmP>aP){}

这样,如果mmP为0,则第一个条件将返回false,并且不会处理第二个条件。

你可以强制执行一个条件,而不需要另外制作IF的意大利面。

我不确定我是否了解您的用例,所以如果这对您不起作用,请对其进行评论。