如何在JavaScript中按条件合并数组字段?(针对CLI字符串拆分数组的合并需求)
解决方案:处理CLI数组的合并与替换逻辑
我来分享一个能满足你所有需求的实现方案,逻辑清晰还能适配各种场景——不管CLI输出的顺序怎么变,也不管STRING3、STRING4是都存在、只存在一个还是都不存在,都能正确处理:
完整代码实现
var CLI = "STRING1 28 1.0\nSTRING2 26 0.5\nSTRING3 2 2.0\nSTRING4 5 1.0"; var CLIarr = CLI.toString().split("\n").map(line => line.split(" ")); // 初始化变量,专门存STRING3和STRING4的数据 let str3 = null; let str4 = null; let remainingItems = []; // 遍历数组,把目标条目和其他条目分开处理 for (let item of CLIarr) { if (item[0] === 'STRING3') { str3 = { count: parseInt(item[1]), value: parseFloat(item[2]) }; } else if (item[0] === 'STRING4') { str4 = { count: parseInt(item[1]), value: parseFloat(item[2]) }; } else { remainingItems.push(item); } } // 根据不同情况处理合并或替换 let mergedInfo = ''; if (str3 && str4) { // 两者都存在,计算合并值并生成提示信息 const totalCount = str3.count + str4.count; const avgValue = (str3.value + str4.value) / 2; mergedInfo = `Info: ${str3.count}+${str4.count}=${totalCount} and (${str3.value}+${str4.value})/2=${avgValue}`; // 添加合并后的条目到列表 remainingItems.push(['MERGED', totalCount.toString(), avgValue.toString()]); } else if (str3 || str4) { // 只存在其中一个,替换成STRING5(原条目已经被过滤掉,相当于移除原条目添加新的) const target = str3 || str4; remainingItems.push(['STRING5', target.count.toString(), target.value.toString()]); } // 按要求输出结果 if (mergedInfo) { console.log(mergedInfo); } // 输出所有保留的条目 for (let item of remainingItems) { console.log(item.join(' ')); } // 最后输出固定的Info console.log('Info');
关键逻辑说明
- 数据分离:遍历数组时,把STRING3、STRING4单独提取出来,其他正常条目放到
remainingItems里,这样后续处理不会干扰原有内容,也能轻松适配任意顺序的CLI输出。 - 多分支处理:
- 当STRING3和STRING4都存在时:计算总数量和平均值,生成要求的提示文本,然后把合并后的
MERGED条目加入剩余列表。 - 当仅存在其中一个时:直接将其替换为
STRING5并加入列表(原条目已经被排除在remainingItems外,相当于完成了“移除原条目添加新条目”的要求)。 - 当两者都不存在时:直接输出所有正常条目即可,无需额外操作。
- 当STRING3和STRING4都存在时:计算总数量和平均值,生成要求的提示文本,然后把合并后的
- 类型转换:把数字字符串转成数值类型计算,最后再转回字符串输出,保证计算的准确性。
测试场景验证
场景1:仅存在STRING3
var CLI = "STRING1 10 0.8\nSTRING3 3 1.5";
输出结果:
STRING1 10 0.8 STRING5 3 1.5 Info
场景2:两者都不存在
var CLI = "STRING1 5 2.0\nSTRING2 3 1.0";
输出结果:
STRING1 5 2.0 STRING2 3 1.0 Info
场景3:顺序打乱的情况
var CLI = "STRING4 5 1.0\nSTRING1 28 1.0\nSTRING3 2 2.0\nSTRING2 26 0.5";
输出结果和示例一致:
Info: 2+5=7 and (2.0+1.0)/2=1.5 STRING1 28 1.0 STRING2 26 0.5 MERGED 7 1.5 Info
内容的提问来源于stack exchange,提问作者user10002209
相关产品推荐
相关产品推荐

