我的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的意大利面
答案 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的意大利面。
我不确定我是否了解您的用例,所以如果这对您不起作用,请对其进行评论。