Javascript 按code+brc+dest主键合并数组取最严格type实现方案
JavaScript 数组按组合主键高效合并方案
实现思路
- 第一步:将所有输入项的
value字段拍平为一维数组,避免多层嵌套遍历 - 第二步:单次遍历所有项,用Map存储每个
code+brc+dest组合主键对应的最高优先级type(HARD优先级高于SOFT,只要组合下出现过一次HARD,就记录为HARD) - 第三步:再次遍历所有项,替换为对应主键的最高优先级
type,同时去重完全相同的项,得到最终结果
实现代码
function doMerge(inputData) { // 1. 拍平所有value数组项 const allItems = inputData.flatMap(group => group.value); // 2. 统计每个组合主键的最高优先级type const priorityMap = new Map(); // 拼接key加分隔符避免不同字段拼接冲突 const getKey = item => `${item.code}|${item.brc}|${item.dest}`; allItems.forEach(item => { const key = getKey(item); const existedType = priorityMap.get(key); // 未记录过,或当前项type优先级更高则更新 if (!existedType || item.type === 'HARD') { priorityMap.set(key, item.type); } }); // 3. 处理去重+替换type const uniqueSet = new Set(); const result = []; allItems.forEach(item => { const key = getKey(item); // 替换为最高优先级type const processed = {...item, type: priorityMap.get(key)}; // 序列化判断是否重复,也可根据业务自定义去重规则 const itemStr = JSON.stringify(processed); if (!uniqueSet.has(itemStr)) { uniqueSet.add(itemStr); result.push(processed); } }); return result; }
调用测试
// 传入你提供的data变量即可得到期望输出 console.log(doMerge(data));
性能说明
整体时间复杂度为O(m),m为所有value项的总数量,相比原四层嵌套循环的O(n²)复杂度,数据量越大性能优势越明显。
内容的提问来源于stack exchange,提问作者Veryon890
相关产品推荐
相关产品推荐

