成绩统计系统是教育管理中的常见需求,这个JavaScript实现方案提供了完整的成绩分析功能。我们先看核心的analyzeGrades函数,它接收一个成绩数组,返回包含各类统计数据的对象。
在统计前必须进行数据清洗,这是很多初学者容易忽略的关键步骤:
javascript复制const validGrades = grades.filter(grade => {
return typeof grade === 'number' && !isNaN(grade) && grade >= 0 && grade <= 100;
});
这段验证逻辑确保:
实际项目中,建议增加更严格的输入校验,比如检查小数位数不超过2位。
核心统计逻辑采用遍历计算方式:
javascript复制validGrades.forEach(score => {
total += score;
if (score > maxScore) maxScore = score;
if (score < minScore) minScore = score;
});
这里有几个优化点:
forEach而非for循环,代码更简洁评级标准采用常见的四分法:
javascript复制if (score >= 90) levelStats["优"]++;
else if (score >= 80) levelStats["良"]++;
else if (score >= 60) levelStats["中"]++;
else levelStats["差"]++;
实际应用中,评级标准可能需要动态配置,可以考虑将评级规则提取为可配置参数。
完数(Perfect Number)是指等于其真因子之和的正整数。这个实现展示了如何通过嵌套循环高效查找完数。
javascript复制for (let num = start; num <= end; num++) {
let sum = 0;
const factors = [];
for (let i = 1; i < num; i++) {
if (num % i === 0) {
sum += i;
factors.push(i);
}
}
if (sum === num && sum !== 0) {
res.push({ num, factors });
}
}
关键点:
当前算法时间复杂度为O(n²),当范围较大时效率较低。可以考虑以下优化:
javascript复制for (let i = 2; i <= Math.sqrt(num); i++)
示例中的表格输出方式直观展示了完数验证过程:
javascript复制html += `<tr>
<td>${item.num}</td>
<td>${joinFactor}</td>
<td>${joinFactor} = ${item.num}</td>
</tr>`;
这种可视化方式让数学验证过程一目了然,非常适合教学场景。
数组合并是JavaScript常见操作,这里实现了基本的数组合并+去重功能。
javascript复制function mergeArrays(arr1, arr2) {
let result = [];
// 添加arr1元素
for (let i = 0; i < arr1.length; i++) {
result.push(arr1[i]);
}
// 检查并添加arr2元素
for (let i = 0; i < arr2.length; i++) {
let exists = false;
for (let j = 0; j < result.length; j++) {
if (arr2[i] === result[j]) {
exists = true;
break;
}
}
if (!exists) {
result.push(arr2[i]);
}
}
return result;
}
这种实现方式:
ES6提供了更简洁的实现方式:
javascript复制function mergeArrays(arr1, arr2) {
return [...new Set([...arr1, ...arr2])];
}
这种方案的优缺点:
示例中良好的错误处理实践:
javascript复制try {
let arr1 = JSON.parse(arr1Str);
let arr2 = JSON.parse(arr2Str);
if (!Array.isArray(arr1) || !Array.isArray(arr2)) {
throw new Error('请输入有效的数组格式');
}
// ...
} catch (error) {
alert('输入格式错误:' + error.message);
}
关键点:
边界值问题:
性能优化:
数据精度:
实际项目中可以:
javascript复制function mergeWithComparator(arr1, arr2, comparator) {
// ...
}
javascript复制function mergeObjectArrays(arr1, arr2, key) {
const map = new Map();
[...arr1, ...arr2].forEach(item => map.set(item[key], item));
return [...map.values()];
}
将三个功能拆分为独立模块:
code复制/src
/gradeAnalyzer.js
/perfectNumber.js
/arrayMerge.js
使用Jest编写测试用例:
javascript复制describe('gradeAnalyzer', () => {
test('should handle empty array', () => {
expect(analyzeGrades([])).toEqual({
validGrades: [],
total: 0,
average: 0,
maxScore: 0,
minScore: 0,
levelStats: { 优:0, 良:0, 中:0, 差:0 }
});
});
});
使用JSDoc完善文档:
javascript复制/**
* 分析成绩数据
* @param {number[]} grades - 成绩数组
* @returns {{
* validGrades: number[],
* total: number,
* average: number,
* maxScore: number,
* minScore: number,
* levelStats: {优:number, 良:number, 中:number, 差:number}
* }}
*/
function analyzeGrades(grades) { ... }
这三个JavaScript实现虽然功能不同,但都展示了良好的编程实践:严谨的输入验证、清晰的逻辑结构、合理的错误处理。在实际项目中,可以根据具体需求选择合适的优化方向,平衡代码简洁性、性能和可维护性。