JavaScript如何将一维数组按指定分组数拆分为二维数组?
按指定组数将一维数组拆分为二维数组
需求规则
将一维数组targetItems按照splitNumber指定的分组数量拆分为二维数组,拆分时保持原数组元素顺序,若数组长度无法被分组数整除,靠前的分组优先分配多出来的元素。
示例场景
初始测试入参:
const targetItems = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const splitNumber = 2;
对应预期输出:
[[1, 2, 3, 4, 5], [6, 7, 8, 9]];
其他边界场景预期:
- 数组长度为5、分组数为2时,输出
[[1,2,3], [4,5]] - 数组长度为17、分组数为2时,输出
[[1,2,3,4,5,6,7,8,9], [10,11,12,13,14,15,16,17]] - 数组长度为5、分组数为3时,输出
[[1,2], [3,4], [5]]
实现方案
不建议用Math.round做长度取整,这类方法很容易出现分组长度计算偏差,导致最后一组为空或者元素错位。直接按「基础组长度+余数前置分配」的逻辑实现即可,代码如下:
function splitToGroups(arr, groupNum) { // 非法分组数直接返回空数组 if (groupNum < 1) return []; // 分组数大于等于数组长度时,每个元素单独成组 if (groupNum >= arr.length) return arr.map(i => [i]); const res = []; const total = arr.length; // 每组最少分配的元素个数 const baseLen = Math.floor(total / groupNum); // 多出来待分配的元素个数,前remainder个组每组多拿1个 const remainder = total % groupNum; let cursor = 0; for (let i = 0; i < groupNum; i++) { const groupLen = baseLen + (i < remainder ? 1 : 0); res.push(arr.slice(cursor, cursor + groupLen)); cursor += groupLen; } return res; } // 验证所有测试场景 console.log(splitToGroups([1,2,3,4,5,6,7,8,9], 2)); // 输出 [[1,2,3,4,5],[6,7,8,9]] console.log(splitToGroups([1,2,3,4,5], 2)); // 输出 [[1,2,3],[4,5]] console.log(splitToGroups(Array.from({length:17}, (_,idx)=>idx+1), 2)); // 输出 [[1,2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17]] console.log(splitToGroups([1,2,3,4,5], 3)); // 输出 [[1,2],[3,4],[5]]
实现特点
- 纯索引切片实现,不会修改原数组
- 覆盖分组数非法、分组数大于数组长度等边界场景
- 时间复杂度O(n),无额外性能损耗
内容的提问来源于stack exchange,提问作者december964
相关产品推荐
相关产品推荐

