JavaScript实现字符串两次拆分并计算总分的函数求助
修正后的计算总分函数及问题解析
完整修正代码
function getTotal(input_text) { // 按newline拆分,同时过滤掉末尾空行(避免处理无效内容) const lines = input_text.split("newline").filter(line => line.trim() !== ""); const moduleMarks = []; for (let i = 0; i < lines.length; i++) { // 拆分当前行,同时去除各部分的空格 const [module, markStr] = lines[i].split(",").map(item => item.trim()); // 将分数转为数字后存入数组 moduleMarks.push({ module, mark: Number(markStr) }); } // 累加所有分数得到总分 const totalMarks = moduleMarks.reduce((sum, item) => sum + item.mark, 0); return totalMarks; } // 测试示例输入 const testInput = "a, 80newlineb, 50newline"; console.log(getTotal(testInput)); // 输出 130
如果不需要保存模块信息,只想快速计算总分,可以用更简洁的写法:
function getTotal(input_text) { return input_text.split("newline") .filter(line => line.trim() !== "") .map(line => { // 只提取分数部分并转成数字 const [_, markStr] = line.split(",").map(item => item.trim()); return Number(markStr); }) .reduce((sum, mark) => sum + mark, 0); }
原代码的核心错误及修正说明
变量未声明
原代码里marks_array、split、module_marks都没加let/const声明,JS会把这些变量自动挂到全局对象上,容易引发意外问题,必须显式声明变量。拆分结果未保存
lines[i].split(",")只是执行了拆分操作,但没把结果赋值给变量,等于白执行,根本没法获取拆分后的模块名和分数。循环引用错误
循环里错误地用了lines[0]和lines[1],这会导致每次循环都取数组前两个元素,而不是当前循环的lines[i],完全不符合逻辑,应该处理当前行的拆分结果。数组名称不统一
一开始定义的数组是marks_array,后来push用的是module_marks,这会直接报错(module_marks未定义),必须统一变量名。分数类型未转换
拆分出来的分数是字符串类型,直接相加会变成字符串拼接(比如"80"+"50"得到"8050"),必须用Number()转成数字才能做加法运算。未处理空行
输入末尾的newline拆分后会得到空字符串,遍历的时候会处理无效内容,所以用filter过滤掉空行,避免出错。未处理空格
拆分后的元素可能带空格(比如" 80"),用trim()去掉前后空格,确保转数字时不会出现NaN。
内容的提问来源于stack exchange,提问作者Aidan Campbell
相关产品推荐
相关产品推荐

