如何为表格中相同数值的数字设置同色?JS算法逻辑问题求助
问题场景
- 数字会实时随机变化
- 当前数字与下一个数值可能相同,也可能不同
遇到的问题
我用以下算法测试时发现两个问题:
- 当新值和当前值相等时,算法插入了
odd,但实际应该插入even(当前值与下一个值不同时插入even的逻辑是正确的) - 第11行及之后存在类名错误:第11行前的类名应为
even,所以第11、12行应该是odd
测试代码
const tst = [ { buy: 84.16 }, { buy: 84.16 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, ]; let className = []; tst.forEach((el, i) => { const OLD_ELEMENT = tst[i === 0 ? 0 : i - 1].buy; className.push(el.buy === OLD_ELEMENT ? 'odd' : 'even'); console.log(`${el.buy}:${OLD_ELEMENT} --- ${className[i]}`); })
问题分析与修正
原代码的核心问题:
- 逻辑判断完全搞反:把「与前一个值相等」对应
odd,「不等」对应even,和需求匹配不上 - 未处理连续相同值的类名继承:连续相同值应该保持同一个类名,只有值变化时才切换类名
修正后的代码:
const tst = [ { buy: 84.16 }, { buy: 84.16 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, { buy: 84.15 }, ]; let className = []; // 初始化第一个元素的类名 let currentClass = 'even'; tst.forEach((el, i) => { if (i > 0) { // 和前一个值比较,不同则切换类名 if (el.buy !== tst[i - 1].buy) { currentClass = currentClass === 'even' ? 'odd' : 'even'; } } className.push(currentClass); console.log(`${el.buy} --- ${className[i]}`); })
修正逻辑说明:
- 第一个元素默认设为
even - 从第二个元素开始,若当前值与前一个值不同,则切换类名(even↔odd);若相同则沿用当前类名
- 连续相同值会保持同一个类,值变化时自动切换,完全符合需求
内容的提问来源于stack exchange,提问作者THIAGO DE BONIS
相关产品推荐
相关产品推荐

