You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扫描多变量值并按条件交换变量位置(附代码示例)

优化多变量扫描与匹配项前移方案

嘿,我看你现在的代码有大量重复逻辑,手动处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:18:28