如何扫描多变量值并按条件交换变量位置(附代码示例)
优化多变量扫描与匹配项前移方案
嘿,我看你现在的代码有大量重复逻辑,手动处理15个类似的检查块不仅麻烦还容易出错。咱们可以通过批量管理字段和提取通用逻辑来简化代码,完美实现你要的「把匹配到的Medical变量移到前面null位置」的需求。
第一步:把零散变量改成数组,批量管理
别再一个个声明Medical1、MedicalIndex1这种变量了,把它们放进数组里,循环处理就行:
// 保留你原来的文件读取代码 this.importDataObject("MEDDIAGNOSISICD-10.txt", "C:/Users/dell/Documents/tab excel/MEDDIAGNOSISICD-10.txt"); var oFile = this.getDataObjectContents("MEDDIAGNOSISICD-10.txt"); var cFile = util.stringFromStream(oFile, "utf-8"); var fileArray = cFile.split('\n'); // 定义需要处理的所有字段编号(1,3,5...39) const fieldNumbers = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39]; const medicalFields = []; const medicalIndexes = []; // 批量初始化字段和索引 fieldNumbers.forEach(num => { medicalFields.push(this.getField(`Medications ${num}`)); medicalIndexes.push(null); // 初始值设为null }); // 要匹配的疾病数组 const targetDiseases = ["DEPRESSION", "ANGINA", "BIPOLAR DEPRESSION", "ATHEROSCLEROSIS", "HEART ATTACK"];
第二步:写通用检查函数,避免重复循环
把你原来重复15次的检查逻辑抽成一个函数,传入单个字段就能返回对应的MedicalIndex值:
function checkDrugMatchesDisease(medicalField, fileLines, diseases) { for (let line of fileLines) { const drugIndex = line.indexOf(medicalField.value); if (drugIndex > -1) { const [, , diagAnalysis] = line.split('\t'); // 直接解构取诊断字段 // 检查是否匹配任意目标疾病 for (let disease of diseases) { if (diagAnalysis.includes(disease)) { return 1; // 匹配成功,返回1 } } } } return null; // 没匹配到,返回null } // 批量处理所有字段,填充medicalIndexes数组 for (let i = 0; i < medicalFields.length; i++) { medicalIndexes[i] = checkDrugMatchesDisease(medicalFields[i], fileArray, targetDiseases); }
第三步:实现匹配项前移的逻辑
用双指针法交换位置:一个指针找前面第一个空的(null)位置,另一个找后面匹配到的(值为1)位置,找到就交换两者的字段值和索引:
// 双指针交换:把匹配到的项移到前面的空位置 let emptyPositionPointer = 0; // 指向当前最前面的空位置 for (let i = 0; i < medicalIndexes.length; i++) { if (medicalIndexes[i] === 1) { // 先找到前面第一个空的位置 while (emptyPositionPointer < i && medicalIndexes[emptyPositionPointer] !== null) { emptyPositionPointer++; } // 如果找到有效的空位置,就交换 if (emptyPositionPointer < i) { // 交换Medical字段的值 const tempVal = medicalFields[emptyPositionPointer].value; medicalFields[emptyPositionPointer].value = medicalFields[i].value; medicalFields[i].value = tempVal; // 交换MedicalIndex的值 const tempIndex = medicalIndexes[emptyPositionPointer]; medicalIndexes[emptyPositionPointer] = medicalIndexes[i]; medicalIndexes[i] = tempIndex; } } }
优化后的优势
- 彻底消除重复代码:原来15个重复的循环块现在变成一个循环加一个通用函数,后续要加字段只需要修改
fieldNumbers数组就行 - 逻辑更清晰:把文件读取、匹配检查、位置交换拆成独立模块,调试起来更方便
- 避免冗余错误:你的原代码里有重复声明变量的问题(比如重复声明
Medical1),重构后完全避免了这个问题
这样调整后,代码不仅简洁,还完全实现了你要的功能:先扫描所有Medical变量判断是否匹配目标疾病,再把匹配到的变量移到前面的空位置。
内容的提问来源于stack exchange,提问作者Ryan Oliver
相关产品推荐
相关产品推荐

