基于首元素合并多数组的优化方案咨询(支持Date对象)
合并多组二维数组(按首元素匹配)
我有三个二维数组,每个数组的子数组首元素(示例中为数字,实际场景下是Date对象)完全一致,需要将它们按照首元素合并为一个新数组。
输入示例
[[1, 'A'], [2, 'B'], [3, 'C']]; [[1, 'D'], [2, 'E'], [3, 'F']]; [[1, 'G'], [2, 'H'], [3, 'I']];
预期输出
[ [ 1, 'A', 'D', 'G' ], [ 2, 'B', 'E', 'H' ], [ 3, 'C', 'F', 'I' ] ]
我的实现代码
function mergeArrays(arrays) { const mergedMap = new Map(); for (const array of arrays) { for (const item of array) { const key = item[0]; if (!mergedMap.has(key)) { mergedMap.set(key, [key]); } mergedMap.get(key).push(...item.slice(1)); } } const mergedArray = Array.from(mergedMap.values()); return mergedArray; } const array1 = [[1, 'A'], [2, 'B'], [3, 'C']]; const array2 = [[1, 'D'], [2, 'E'], [3, 'F']]; const array3 = [[1, 'G'], [2, 'H'], [3, 'I']]; const mergedResult = mergeArrays([array1, array2, array3]); console.log(mergedResult);
更优解决方案
既然题目明确所有数组的子数组首元素完全一致(即数组长度相同,且对应位置的子数组首元素匹配),我们可以直接利用索引对应关系来合并,省去Map的查找和存储开销,代码更简洁高效,还能避免Date对象作为Map键时的引用比较问题:
function mergeArrays(arrays) { // 基于第一个数组的元素索引,直接合并对应位置的所有子数组内容 return arrays[0].map((firstArrItem, index) => { // 先取首元素,再拼接当前子数组的后续值,最后拼接其他数组对应位置的后续值 return [ firstArrItem[0], ...firstArrItem.slice(1), ...arrays.slice(1).flatMap(arr => arr[index].slice(1)) ]; }); } // 测试代码 const array1 = [[1, 'A'], [2, 'B'], [3, 'C']]; const array2 = [[1, 'D'], [2, 'E'], [3, 'F']]; const array3 = [[1, 'G'], [2, 'H'], [3, 'I']]; console.log(mergeArrays([array1, array2, array3]));
方案优势
- 性能更优:避免了Map的
has/get等额外操作,直接通过索引访问元素,减少了不必要的计算开销 - 更贴合场景:完全利用题目给出的“首元素完全一致”的前提条件,逻辑更直接
- 避免引用问题:对于Date对象这类引用类型,无需担心Map键的引用比较问题,直接按位置匹配更可靠
如果后续存在数组顺序不一致、首元素不唯一的场景,你原来的Map方案依然是通用的选择,但针对当前题目给出的明确条件,上述索引方案是更优的。
内容的提问来源于stack exchange,提问作者Murtuza Z
相关产品推荐
相关产品推荐

