【问题标题】:Javascript tables paint rows according to valueJavascript表根据值绘制行
【发布时间】:2016-10-28 17:09:05
【问题描述】:

我得到了下表(例如,该表是动态的,可能会更改其值):

.negative {
          background-color: red;
          font-weight: bold;
        }
.positive {
          background-color: green;
          font-weight: bold;
        }


<table border="1" align="center" id="testtable1">

<tr>
 <th>#</th>
 <th>Positive</th>
 <th>Negative</th>
</tr>
    <tr>
        <td>1</td>
        <td class="odd">7.4</td>
        <td class="even">4.4</td>
    </tr>
    <tr>
        <td>2</td>
        <td class="odd">1</td>
        <td class="even">5.4</td>
    </tr>
    <tr>
        <td>3</td>
        <td class="odd">2</td>
        <td class="even">2.4</td>
    </tr>
</table>

我需要从左列和右列中找到最大值并将每个最大值的整个 1 行绘制为正(绿色背景)或负(红色)颜色,所以第 1 行应该全是绿色,第 # 行2 应该是红色的。第 3 行应为白色(不应绘制最大值)。如果正最大值和负最大值都在同一行上,则该行应涂成绿色,然后应找到第二个负最大值并将其涂成红色。到目前为止,我已经得到了以下 JS 代码:

function MakeColors() {
 table = document.getElementById("testtable1");
 TRs = document.getElementsByTagName('tr');
 TDs = document.getElementsByTagName('td')

 var max_val_pos = 0;
 var max_val_neg = 0;
 var max_val_neg2 = 0;
 for (var i = 0; i < TDs.length; i++) {

   var temp = TDs[i];
   var tdval = parseFloat(temp.firstChild.nodeValue);
   if(max_val_pos < tdval && temp.className == "odd") {
     max_val_pos = tdval;
   }
   if(max_val_neg < tdval && temp.className == "even") {
     max_val_neg = tdval;
   }
   if(max_val_neg2 < tdval && 
     tdval != max_val_neg && 
     temp.className == "even"){
    max_val_neg2 = tdval;  
  } 
}

for (var i = 0, row; row = table.rows[i]; i++) {
 for (var j = 0, col; col = row.cells[j]; j++)  {
  if (parseFloat(col.firstChild.nodeValue) == max_val_pos)   {row.className = "positive";}
 if (parseFloat(col.firstChild.nodeValue) == max_val_neg &&    row.className !="positive") {row.className = "negative";}else if(parseFloat(col.firstChild.nodeValue) == max_val_neg2){row.className = "negative";

      }
     }  
   }
 }

MakeColors();

问题是如果第一个负最大值发生变化,我无法找到负列的下一个最接近的最大值。一般来说,我可以为一种情况找到解决方案,但是当数据更改时,结果会中断并且我绘制错误的行。欢迎任何如何解决问题的想法。谢谢。

【问题讨论】:

  • 每次更改数据时再次致电makeColors()
  • 这实际上是问题所在。每次调用 makeColors() 时,可能会根据表格内容产生正确或不正确的结果
  • 您能描述一下在这种情况下预期的结果应该是什么:jsfiddle.net/fgqfqs09 哪些方块显示不正确?它们是错误的颜色还是错误的数字?
  • 很抱歉,这种解释令人困惑。您需要以列表的形式明确定义所需的结果(在工具栏上;左侧第 8 个图标)要模拟红色,请使用 &gt;(第 4 个图标)和代码括号 {}(第 5 个图标)为绿色。什么时候说最大值...行的最大值或与表中所有单元格相比的最大值?
  • 对于mike510a fiddle,第3行绿色,正值为21.5是正确的,第2行红色,值为5.4是错误的。在这种情况下,红色行应该是第一个值为 9.4 的行,这是 Negative 列中 15.4 之后的第二个负值。您也可以尝试使用不同值的代码,以查看其工作和失败的场景。

标签: javascript html algorithm


【解决方案1】:

正如@mike510a 所说,您每次更改数据时都可以再次调用makeColors(),但您必须进行一些更正:

  1. 您需要重置既不是最大值也不是最小值的行。

  2. 您需要考虑如果两个值相同会发生什么。如果有两个最大值,你们都涂成绿色吗?如果最小值和最大值在同一行,则将该行绘制为绿色,但如果有另一行具有相同的最小值,那么您可能希望将该行绘制为红色,而不是算法找到的第二个最小值的行。

所以最简单的方法是先绘制最大行数,然后绘制最小行数:

  1. 查找最大值
  2. 绘制最大行并重置其他行 (.className = "")
  3. 查找最小值,忽略已绘制的行
  4. 绘制最小行,同时忽略已绘制的行

【讨论】:

  • 那么我是否需要重构代码以便在找到最大值后将行涂成绿色,然后仅在找到最大负数后才将行涂成红色?现在我有 2 个循环 - 在第一个循环中,我找到最大正数和负数(如果没有绘制行,这就是问题),然后我绘制它们。
  • 是的,你可以做 4 个循环,每个点对应一个循环。是的,它可以更有效地完成,但我怀疑它是否重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2016-12-08
  • 2019-05-11
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多