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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:18:22