JS按首元素合并二维数组:将多元素数组归至对应单元素数组下方
二维数组分组整理实现方案
核心思路
- 遍历原数组,将元素分为两类:单元素子数组(以唯一元素为键)、多元素子数组(以首元素为键),同时记录单元素子数组的首次出现顺序
- 按照记录的单元素顺序,依次输出对应单元素子数组,再按原数组顺序追加该键下的所有多元素子数组
- 反向场景无需额外修改逻辑:无论单元素子数组出现在原数组的哪个位置,都会先记录其出现顺序,后续将对应多元素子数组按原顺序挂载到其下方
代码实现(JavaScript示例)
function groupSubarrays(arr) { const singleElementOrder = []; const singleElementMap = new Map(); const multiElementMap = new Map(); // 第一步:分类存储元素,记录顺序 for (const item of arr) { const key = item[0]; if (item.length === 1) { if (!singleElementMap.has(key)) { singleElementMap.set(key, item); singleElementOrder.push(key); } } else { if (!multiElementMap.has(key)) { multiElementMap.set(key, []); } multiElementMap.get(key).push(item); } } // 第二步:按顺序组装结果 const result = []; for (const key of singleElementOrder) { result.push(singleElementMap.get(key)); if (multiElementMap.has(key)) { result.push(...multiElementMap.get(key)); } } return result; } // 常规场景测试 const originalArr = [ ["WN"], ["WN","LAS"], ["MQ"], ["MQ","ORD"], ["AA"], ["WN","BWI"] ]; console.log(groupSubarrays(originalArr)); // 输出:[["WN"], ["WN","LAS"], ["WN","BWI"], ["MQ"], ["MQ","ORD"], ["AA"]] // 反向场景测试(单元素组在多元素组之后) const reverseArr = [ ["WN","LAS"], ["MQ","ORD"], ["WN"], ["AA"], ["WN","BWI"], ["MQ"] ]; console.log(groupSubarrays(reverseArr)); // 输出:[["WN"], ["WN","LAS"], ["WN","BWI"], ["AA"], ["MQ"], ["MQ","ORD"]]
逻辑说明
- 单元素子数组仅保留首次出现的实例与顺序,若需求是保留所有单元素子数组,可将
singleElementMap改为存储数组,遍历原数组时直接追加即可 - 多元素子数组严格遵循原数组中的出现顺序,不会因分组调整打乱原有排列
- 该逻辑天然支持反向场景,核心是优先记录单元素的出现顺序,再批量挂载对应多元素子数组
内容的提问来源于stack exchange,提问作者ET-CS
相关产品推荐
相关产品推荐

