如何根据属性值对数组分块(单块flagCount总和≤3)
数组分块实现需求
给定如下数组:
const arr = [{flagCount: 3, rank:1}, {flagCount: 3, rank:2}, {flagCount: 1, rank:3}, {flagCount: 1,rank:4}, {flagCount: 1, rank:5}, {flagCount: 2, rank:6},{flagCount: 2, rank:7},{flagCount: 2,rank:8},{flagCount: 1,rank:9}]
需要按照以下规则对数组对象进行分块:
- 每个分块内所有对象的
flagCount总和不超过3 - 必须保持原数组的
rank顺序(即原数组元素的先后顺序)
期望得到的结果数组:
const resultArr = [[{flagCount: 3,rank:1}], [{flagCount: 3,rank:2}], [{flagCount: 1,rank:3}, {flagCount: 1,rank:4}, {flagCount: 1,rank:5}], [{flagCount: 2,rank:6}], [{flagCount: 2,rank:7}], [{flagCount: 2,rank:8}, {flagCount: 1,rank:9}]]
实现思路与代码
通过遍历原数组,维护当前分块和分块的flagCount总和,逐个判断元素是否能加入当前分块即可实现需求:
function chunkByFlagCount(arr) { const result = []; let currentChunk = []; let currentSum = 0; for (const item of arr) { // 兼容单个元素flagCount超过3的边界情况 if (item.flagCount > 3) { if (currentChunk.length > 0) { result.push(currentChunk); currentChunk = []; currentSum = 0; } result.push([item]); continue; } // 判断加入当前元素后总和是否符合要求 if (currentSum + item.flagCount <= 3) { currentChunk.push(item); currentSum += item.flagCount; } else { // 当前分块已满,推入结果后新建分块 result.push(currentChunk); currentChunk = [item]; currentSum = item.flagCount; } } // 处理最后剩余的分块 if (currentChunk.length > 0) { result.push(currentChunk); } return result; } // 测试示例 const arr = [{flagCount: 3, rank:1}, {flagCount: 3, rank:2}, {flagCount: 1, rank:3}, {flagCount: 1,rank:4}, {flagCount: 1, rank:5}, {flagCount: 2, rank:6},{flagCount: 2, rank:7},{flagCount: 2,rank:8},{flagCount: 1,rank:9}]; console.log(chunkByFlagCount(arr));
代码说明
- 初始化结果数组、当前分块容器和分块总和计数器。
- 遍历原数组每个元素:
- 若元素自身的
flagCount超过3,先处理完当前分块,再将该元素单独作为新分块。 - 若加入当前元素后分块总和不超过3,则将元素加入当前分块并更新总和。
- 若总和超出限制,则将当前分块推入结果数组,新建分块放入当前元素并重置总和。
- 若元素自身的
- 遍历结束后,将最后剩余的非空分块推入结果数组。
该方案严格保证了分块的顺序与原数组一致,同时满足分块总和的限制条件。
内容的提问来源于stack exchange,提问作者Arup Bhattacharya
相关产品推荐
相关产品推荐

