JavaScript 多数组交错合并实现(支持非等长补位)
通用二维嵌套数组交错合并实现修正
现有实现的核心问题
当前代码仅能处理2个内层数组的场景,本质是两个逻辑层面的缺陷:
- 硬编码绑定双数组取值:在完成数组对齐补位后的遍历环节,代码固定只从第1、2个内层数组中读取同索引位置的元素推入结果集,完全没有遍历其余内层数组的逻辑,只要内层数组数量超过2,对应元素就会被完全漏掉。
- 补位判断存在笔误:补位函数中的判断条件
if (arr != maxLength)有明显逻辑问题,arr是数组对象,和数字类型的maxLength永远不可能相等,这个判断属于完全冗余的无效代码,虽然不影响后续while循环的补位效果,但属于容易误导后续维护的低级错误。
修正后的通用版本
核心调整遍历逻辑,不再固定读取特定下标的内层数组,而是针对每一个对齐后的索引位,按顺序取所有内层数组的对应值推入结果集,同时修正补位函数的笔误,还可以移除原代码里查找最长数组位置的冗余逻辑——求最长数组长度不需要定位最长数组的具体下标,直接对所有内层数组的长度取最大值即可,减少不必要的数组遍历。
function interleave(...masterArray) { let rtnArray = []; // 空输入边界处理 if (masterArray.length === 0) return rtnArray; // 直接计算所有内层数组的最大长度,替代原冗余的getLongestArray逻辑 let longestInnerArrayLength = Math.max(...masterArray.map(arr => arr.length)); padAllArraysToSameLength(masterArray, longestInnerArrayLength); // 按索引逐位遍历,依次取所有内层数组的对应值 for (let index = 0; index < longestInnerArrayLength; index++) { masterArray.forEach(innerArr => { rtnArray.push(innerArr[index]); }) } return rtnArray; } function padAllArraysToSameLength(masterArray, maxLength) { return masterArray.forEach(arr => { // 修正原笔误:判断数组长度是否和目标长度一致 if (arr.length !== maxLength) { while(arr.length !== maxLength) { arr.push(null); } } }) }
覆盖场景验证
修正后的实现可以适配所有规则要求的场景:
- 双数组等长输入:
interleave([1,2,3], ['c','d','e'])输出[1, 'c', 2, 'd', 3, 'e'],匹配基础合并规则 - 双数组不等长输入:
interleave([1,2,3], [4,5])输出[1,4,2,5,3,null],匹配null补位规则 - 三数组等长输入:
interleave([1,2,3], [4,5,6], [7,8,9])输出[1,4,7,2,5,8,3,6,9],满足多数组合并需求 - 多数组不等长输入:
interleave([1,2], [3], [4,5,6,7])先将所有数组补位对齐到长度4,最终输出[1,3,4,2,null,5,null,null,6,null,null,7],符合非等长处理逻辑
内容的提问来源于stack exchange,提问作者hello world
相关产品推荐
相关产品推荐

