JavaScript实现数组合并:同前缀元素集中排列并去重
JavaScript 数组拼接实现方案
需求说明
给定两个数组:
- 基础数组
column_list,示例值:["ab","bc","cd","asv_a","asv_f","asv_l","asv_x", "xy","yz"] - 待合并数组
new_column,所有元素均带asv_前缀,元素可重复,示例值:["asv_b", "asv_f", "asv_s"]
合并后需要满足:
- 所有带
asv_前缀的元素集中排列在数组中间 - 全量元素去重
- 不带
asv_前缀的元素,保留原有相对顺序,分为前后两段 - 示例预期输出:
["ab","bc","cd","asv_a","asv_f","asv_l","asv_x","asv_b", "asv_s", "xy","yz"]
实现逻辑
- 遍历基础数组,用标记位区分是否已经遇到过
asv_前缀元素:遇到之前的非asv元素归为前缀段,遇到之后的非asv元素归为后缀段,同时收集基础数组中已有的asv元素并去重 - 合并基础数组的asv元素和待合并数组的asv元素,用Set去重,保留原有出现顺序:基础数组里的asv按原顺序排列,待合并数组里新增的asv按出现顺序追加,重复元素自动过滤
- 按「前缀段 + 去重合并后的asv段 + 后缀段」的顺序拼接,得到最终结果
可运行代码
function mergeColumns(column_list, new_column) { const ASV_PREFIX = 'asv_'; const prefixPart = []; const suffixPart = []; const asvCollection = []; let hasReachAsvArea = false; // 拆分原数组 for (const item of column_list) { if (item.startsWith(ASV_PREFIX)) { hasReachAsvArea = true; if (!asvCollection.includes(item)) { asvCollection.push(item); } } else { hasReachAsvArea ? suffixPart.push(item) : prefixPart.push(item); } } // 合并新的asv元素,去重 const asvSet = new Set(asvCollection); new_column.forEach(item => { if (!asvSet.has(item)) asvSet.add(item); }); // 拼接最终结果 return [...prefixPart, ...asvSet, ...suffixPart]; } // 测试用例 const column_list = ["ab","bc","cd","asv_a","asv_f","asv_l","asv_x", "xy","yz"]; const new_column = ["asv_b", "asv_f", "asv_s"]; const result = mergeColumns(column_list, new_column); console.log(result); // 输出与预期一致:["ab","bc","cd","asv_a","asv_f","asv_l","asv_x","asv_b", "asv_s", "xy","yz"]
兼容性说明
该实现同时兼容极端场景:
- 基础数组无asv元素时,合并后的asv段会接在所有原数组元素之后
- 基础数组全为asv元素时,前后缀段为空,直接返回去重后的全量asv数组
- new_column存在重复元素时,会自动过滤重复项,保留第一次出现的位置
内容的提问来源于stack exchange,提问作者Mukul Kumar
相关产品推荐
相关产品推荐

