You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于首元素合并多数组的优化方案咨询(支持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]));

方案优势

  1. 性能更优:避免了Map的has/get等额外操作,直接通过索引访问元素,减少了不必要的计算开销
  2. 更贴合场景:完全利用题目给出的“首元素完全一致”的前提条件,逻辑更直接
  3. 避免引用问题:对于Date对象这类引用类型,无需担心Map键的引用比较问题,直接按位置匹配更可靠

如果后续存在数组顺序不一致、首元素不唯一的场景,你原来的Map方案依然是通用的选择,但针对当前题目给出的明确条件,上述索引方案是更优的。

内容的提问来源于stack exchange,提问作者Murtuza Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:57:42