JavaScript 区间比对表格列值最后区间失效,如何调整IF语句
问题原因
你遇到的问题核心是2个逻辑错误:
- 数组越界:你的
scale数组总长度为5,索引范围是0~4,当循环变量i等于4时,scale[i+1]实际是访问不存在的scale[5],返回值为undefined,因此score <= undefined的判断结果永远为假,导致0.8~1的区间完全无法命中。 - classList操作错误:
cell3.classList += scale[i][0]是错误用法,classList是DOMTokenList对象,直接拼接字符串会破坏其结构,应该使用内置的add()方法添加类名。 - (可选优化) 原逻辑没有覆盖得分低于0.2的区间,会导致这部分得分没有匹配的类名。
修复后的代码
var table=document.getElementById("DataTables_Table_0"); var r=0; while(row=table.rows[r++]) { const cell1=row.cells[6]; const cell2=row.cells[5]; const cell3=row.cells[7]; const score=cell1.innerText.substr(2)/cell2.innerText.substr(2); const scale = [['vPoor', 0.2], ['poor', 0.4], ['avg', 0.6], ['good', 0.8], ['vGood', 1]]; // 循环上限减1,避免i+1越界 for (let i = 0; i < scale.length; i++) { // 左闭右开判断,最后一个区间特殊处理包含1 if (i === scale.length - 1 ? score >= scale[i][1] : (score >= scale[i-1]?.[1] || 0) && score < scale[i][1]) { cell3.classList.add(scale[i][0]); // 匹配到就跳出循环,不需要继续判断 break; } } }
逻辑说明
修改后的区间匹配规则:
- 得分0~0.2 → 匹配
vPoor - 得分0.2~0.4 → 匹配
poor - 得分0.4~0.6 → 匹配
avg - 得分0.6~0.8 → 匹配
good - 得分0.8~1(包含1)→ 匹配
vGood
如果要保留你原本的左闭右闭区间逻辑,只需要修改循环条件即可,如下:
// 只修改循环上限为scale.length - 1 for (var i = 0; i < scale.length - 1; i++) { if (scale[i][1] <= score && score <= scale[i+1][1]) { cell3.classList.add(scale[i][0]); break; } }
这种写法对应的匹配区间为[0.2,0.4]、[0.4,0.6]、[0.6,0.8]、[0.8,1],你可以根据自己的实际需求选择。
内容的提问来源于stack exchange,提问作者Leb_Broth
相关产品推荐
相关产品推荐

