如何将JS数组按指定人数分块并优先分配剩余元素
问题原因
你原有实现的chunk方法逻辑是输入固定每块大小,输出数量不固定的分块,和你需要的「输入固定分块数量(对应人数),动态调整每块大小」的需求刚好相反,所以结果不符合要求。
正确实现方案
实现逻辑
- 先计算基础分配量:
base = Math.floor(数组总长度 / 分块数) - 计算需要多分配1个元素的靠前块数:
extra = 数组总长度 % 分块数 - 前
extra个分块,每块分配base + 1个元素,剩余分块每块分配base个元素,按顺序截取即可。
代码实现
Object.defineProperty(Array.prototype, 'splitByPersonCount', { value: function(personCount) { // 边界处理:人数小于等于0直接返回空 if (personCount <= 0) return [] const totalLength = this.length // 边界处理:人数大于等于数组长度,每块1个元素,多余人数分配空块 if (personCount >= totalLength) { return this.map(item => [item]).concat(new Array(personCount - totalLength).fill([])) } const baseSize = Math.floor(totalLength / personCount) const extraCount = totalLength % personCount const result = [] let startIndex = 0 for (let i = 0; i < personCount; i++) { // 前extraCount个块多分配1个元素 const currentSize = i < extraCount ? baseSize + 1 : baseSize result.push(this.slice(startIndex, startIndex + currentSize)) startIndex += currentSize } return result } })
调用说明
调用时直接传入要分配的人数(即你需要的分块总数量)即可,不需要提前计算除法:
// 示例:151个元素分给31个人 const arr = new Array(151).fill(0).map((_, i) => i+1) const res = arr.splitByPersonCount(31)
验证结果
- 100个元素分给10个人:输出10个块,每个块10个元素,符合规则1
- 100个元素分给9个人:前1个块10个元素,剩余8个块各9个元素,符合规则2
- 100个元素分给11个人:前1个块10个元素,剩余10个块各9个元素,符合规则3
内容的提问来源于stack exchange,提问作者user16731842
相关产品推荐
相关产品推荐

