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

如何将数组等分成块后,把不足长度的最后块元素均分到前序块

数组分块后剩余元素的分配解决方案

场景说明

给定一个数组:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
// 元素数量可更多

已实现按每3个元素一组分块,得到如下二维数组:

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11] // 最后一组元素数量不足3个
]

需求目标

需要将最后一组的剩余元素分配到前面的完整分组中,有两种分配方式:

  1. 均匀分配:依次将剩余元素加到前面的分组,尽量让分组长度差异最小
    // 期望输出
    [
      [1, 2, 3, 10],
      [4, 5, 6, 11],
      [7, 8, 9],
    ]
    
  2. 随机分配:将剩余元素随机分配到任意前面的分组中
    // 期望输出
    [
      [1, 2, 3, 10],
      [4, 5, 6],
      [7, 8, 9, 11],
    ]
    

现有代码

目前已实现的分块代码如下:

let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
let arrayOfChunks = [];
let amount = 3;
for (let i = 0; i < array.length; i += amount) {
  const chunk = array.slice(i, i + amount);
  if (chunk.length === amount) {
    arrayOfChunks.push(chunk);
  } else {
    console.log(chunk);
    // 输出 [10,11]
  }
}
return arrayOfChunks;

遇到的问题

尝试通过循环根据arrayOfChunks的长度分配剩余元素,但当分组数量变化时(比如分组数为5),该方式无法通用适配,需要更灵活的解决方案。


方案1:均匀分配剩余元素

核心逻辑:先收集所有完整分组,拿到剩余元素后,按顺序循环将剩余元素添加到前面的分组中,直到剩余元素全部分配完毕。

let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
let amount = 3;
let arrayOfChunks = [];
let remaining = [];

// 第一步:拆分数组为完整分组和剩余元素
for (let i = 0; i < array.length; i += amount) {
  const chunk = array.slice(i, i + amount);
  if (chunk.length === amount) {
    arrayOfChunks.push(chunk);
  } else {
    remaining = chunk;
  }
}

// 第二步:均匀分配剩余元素
remaining.forEach((item, index) => {
  // 循环取分组索引,避免超出分组数量
  const targetIndex = index % arrayOfChunks.length;
  arrayOfChunks[targetIndex].push(item);
});

console.log(arrayOfChunks);
// 输出:[[1,2,3,10], [4,5,6,11], [7,8,9]]

方案2:随机分配剩余元素

核心逻辑:拿到剩余元素后,每次随机选择一个前面的分组,将元素添加进去。

let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
let amount = 3;
let arrayOfChunks = [];
let remaining = [];

// 第一步:拆分数组为完整分组和剩余元素
for (let i = 0; i < array.length; i += amount) {
  const chunk = array.slice(i, i + amount);
  if (chunk.length === amount) {
    arrayOfChunks.push(chunk);
  } else {
    remaining = chunk;
  }
}

// 第二步:随机分配剩余元素
remaining.forEach(item => {
  // 随机生成一个分组索引
  const randomIndex = Math.floor(Math.random() * arrayOfChunks.length);
  arrayOfChunks[randomIndex].push(item);
});

console.log(arrayOfChunks);
// 示例输出:[[1,2,3,10], [4,5,6], [7,8,9,11]](每次运行结果可能不同)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:20:57