如何将数组等分成块后,把不足长度的最后块元素均分到前序块
数组分块后剩余元素的分配解决方案
场景说明
给定一个数组:
[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, 2, 3, 10], [4, 5, 6, 11], [7, 8, 9], ] - 随机分配:将剩余元素随机分配到任意前面的分组中
// 期望输出 [ [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
相关产品推荐
相关产品推荐

