如何在私有函数中创建自定义命名全局变量以实现代数工具同类项分组
同类项分组实现方案
原有代码的核心问题
- 拼写错误:
processTERMneg函数里的appendinformaion拼写错误,应为appendinformation - 逻辑条件写反:判断如果变量已存在应该执行push操作,不存在才需要初始化数组,现有代码的if判断逻辑完全颠倒
- 正负处理冗余:不需要拆分
processTERMpos和processTERMneg两个重复函数,提取变量名的逻辑可以统一复用 - 滥用eval和DOM存储:完全不需要用隐藏DOM存代码再执行eval,直接用JS对象做分组容器效率更高、bug更少
- 循环逻辑错误:遍历项的时候不管符号是加还是减都调用了
processTERMpos,完全没有用到processTERMneg函数 - 变量名不一致:一会声明
lLTERM前缀的变量,一会往lTERM前缀的变量里push,必然会触发变量未定义报错
更合理的实现思路
直接用对象作为分组容器,遍历拆分好的项数组,提取每个项的变量名,把项放到对应变量名的数组里即可:
// 已拆分完成的项数组 const terms = ["+a", "+b", "-2a"]; // 分组存储容器 const termGroups = {}; terms.forEach(term => { // 提取变量名:过滤掉符号和数字,只保留字母部分 const varName = term.replace(/[+-]?\d*/g, ''); // 首次遇到的变量先初始化空数组 if (!termGroups[varName]) { termGroups[varName] = []; } // 当前项加入对应分组 termGroups[varName].push(term); }); // 如果需要生成lTERMa、lTERMb这种全局变量,增加以下逻辑即可 Object.entries(termGroups).forEach(([varName, items]) => { window[`lTERM${varName}`] = items; }); // 测试输出 console.log(lTERMa); // ["+a", "-2a"] console.log(lTERMb); // ["+b"]
原有代码的修复版本
如果需要沿用原有实现逻辑,修复后的可运行代码如下:
// 提前确保页面存在id为hiddenData的DOM元素 function appendinformation(info) { // 追加分号避免拼接代码出现语法错误 document.getElementById("hiddenData").innerHTML += info + ';'; } function runData() { eval(document.getElementById("hiddenData").innerHTML); } var termsViewed = 0; var lTermsFound = 0; var seenTerms = []; // 统一处理所有符号的项,不需要拆分正负函数 function processTERM(val) { const varName = val.replace(/[+-]?\d*/g, ''); if (!seenTerms.includes(varName)) { // 首次遇到的变量初始化数组 appendinformation(`var lTERM${varName} = ["${val}"]`); seenTerms.push(varName); lTermsFound++; } else { // 已存在的变量直接追加项 appendinformation(`lTERM${varName}.push("${val}")`); } runData(); termsViewed++; } // 测试用的项数组 const term = ["+a", "+b", "-2a"]; for (var i = 0; i < term.length; i++) { var subject = term[i]; processTERM(subject); } // 测试输出 console.log(lTERMa); // ["+a", "-2a"] console.log(lTERMb); // ["+b"]
内容的提问来源于stack exchange,提问作者wastive
相关产品推荐
相关产品推荐

