JS数组数据加载至表格时员工offer计数全局更新异常排查
问题背景
我近期在开发功能函数,用于提取员工数据数组中的对象并渲染到表格中:
- 依赖的
system类中,system.giveAllEmployees()方法返回全量员工信息数组,system.giveAllOffers()方法返回系统内所有已录入的生效offer数据 - 需求是将两类数据整合填充到id为
employeeData的表格中,遍历统计每位员工分配到的offer数量,和员工基础信息一并展示
当前基础员工数据可以正常加载到表格,但存在异常:每次系统中新录入offer时,表格内所有员工的offer计数都会同步更新,不会仅更新对应关联员工的计数值。
原实现代码如下:
function loadAll() { var a = system.giveAllEmployees(); var b = system.giveAllOffers(); var tr = ""; var table = document.getElementById("employeeData"); let offers = 0; table.innerHTML = ""; a.forEach( x => { b.forEach( y => { if (x.employeeName === y.name) { offers += 1; } return offers; }), tr += '<tr>'; tr += '<td>' + x.name + '</td>' + '<td>' + x.document + '</td>' + '<td>' + x.departament + '</td>' + '<td>' + x.age + '</td>' + '<td>' + offers + '</td>'; tr += '</tr>'; offers = 0; }) table.innerHTML += tr; }
表格渲染效果参考:
问题根因
bug来自两个核心问题:
- 匹配字段写错:渲染员工信息时取的姓名字段是
x.name,但和offer做关联匹配时用的是不存在的字段x.employeeName,所有员工的这个字段值都是undefined,等于所有员工的匹配逻辑都是拿undefined和offer的name字段做对比,只要有offer的name字段值为undefined(新录入未正确关联员工的offer大多是这个情况),遍历每个员工时都会触发计数累加,最终出现全表员工计数同步增长的现象。 - 存在冗余无效逻辑:
b.forEach回调里的return offers没有任何作用,forEach的返回值会被直接忽略;forEach语句后多余的逗号属于不规范写法,虽然不会直接触发报错,但会提升代码维护成本。
修复方案
优先修正关联匹配的字段,同时可以优化统计逻辑,提前对offer做分组计数,避免双层循环重复遍历全量offer,提升大数量下的渲染性能,修复后代码如下:
function loadAll() { const employees = system.giveAllEmployees(); const offers = system.giveAllOffers(); const table = document.getElementById("employeeData"); // 提前按关联员工统计offer数量,避免双层重复循环 const offerCountMap = new Map(); offers.forEach(offer => { // 注意:如果offer存储关联员工的字段不是name(比如是员工id),请替换为实际对应字段,用id匹配准确性远高于姓名字段 const relatedEmp = offer.name; offerCountMap.set(relatedEmp, (offerCountMap.get(relatedEmp) || 0) + 1); }); table.innerHTML = ""; let tableRows = ""; employees.forEach(emp => { // 无对应offer的员工计数默认显示0 const count = offerCountMap.get(emp.name) || 0; tableRows += ` <tr> <td>${emp.name}</td> <td>${emp.document}</td> <td>${emp.departament}</td> <td>${emp.age}</td> <td>${count}</td> </tr> `; }); table.innerHTML = tableRows; }
内容的提问来源于stack exchange,提问作者itsacode001
相关产品推荐
相关产品推荐

