PDF员工评估表单JavaScript需求:统计最高频评级
解决方案:员工评估表单评级统计逻辑
核心思路
- 直接统计每个目标下各评级的出现次数,替代之前的数值赋值加权方案
- 预设评级优先级规则,处理频率平局场景(多个评级次数相同时,按优先级选最高级的结果)
- 支持批量处理9个目标,同时实现实时计算(子目标评级变化时自动更新对应Score字段)
实现代码
// 定义评级优先级(从低到高,后项优先级更高,可根据需求调整顺序) const RATING_PRIORITY = ['Not Applicable', 'Not Met', 'Met', 'Exceeded']; // 计算单个目标的最终评级 function calculateObjectiveScore(objectiveNum) { // 获取当前目标下所有子目标的评级控件(假设子目标控件带有data-objective属性,值为目标编号) const subgoalRatings = document.querySelectorAll(`[data-objective="${objectiveNum}"]`); // 初始化各评级的计数容器 const ratingCounts = { 'Not Applicable': 0, 'Not Met': 0, 'Met': 0, 'Exceeded': 0 }; // 遍历子目标,统计每个评级的出现次数 subgoalRatings.forEach(control => { const selectedRating = control.value; if (ratingCounts.hasOwnProperty(selectedRating)) { ratingCounts[selectedRating]++; } }); // 找出出现次数最多的数值 const maxCount = Math.max(...Object.values(ratingCounts)); // 收集所有达到最高次数的评级候选 const topCandidates = Object.keys(ratingCounts).filter(rating => ratingCounts[rating] === maxCount); // 处理平局:从候选中挑选优先级最高的评级 let finalRating = topCandidates[0]; topCandidates.forEach(candidate => { if (RATING_PRIORITY.indexOf(candidate) > RATING_PRIORITY.indexOf(finalRating)) { finalRating = candidate; } }); // 将结果写入对应Score字段(下拉字段命名为Objective X Rating) const scoreField = document.querySelector(`[name="Objective${objectiveNum} Rating"]`); if (scoreField) { scoreField.value = finalRating; } } // 批量计算所有9个目标的评级 function calculateAllScores() { for (let i = 1; i <= 9; i++) { calculateObjectiveScore(i); } } // 绑定实时计算:当子目标评级变化时,自动更新对应目标的Score document.querySelectorAll('[data-objective]').forEach(control => { control.addEventListener('change', function() { const targetObjective = this.dataset.objective; calculateObjectiveScore(targetObjective); }); });
使用说明
- 控件标识调整:如果子目标控件没有
data-objective属性,可修改选择器匹配实际命名规则,比如子目标命名为Objective1_Subgoal1,则将document.querySelectorAll([data-objective="${objectiveNum}"])替换为document.querySelectorAll(select[name^="Objective${objectiveNum}_Subgoal"]) - 优先级调整:若需提升Not Applicable的权重(比如平局时优先选它),只需修改
RATING_PRIORITY数组顺序,将它移至数组末尾即可 - 触发时机:可在表单提交时调用
calculateAllScores(),或保留change事件监听实现实时更新
内容的提问来源于stack exchange,提问作者Kim Amaral
相关产品推荐
相关产品推荐

