如何在JavaScript中按总元素量拆分多数组对象至指定大小
JavaScript 对象按元素总数拆分函数实现
给定一个包含数组属性的 JavaScript 对象,需将其拆分为对象数组,每个对象的所有属性数组的元素总数不能超过指定的 size 值。
示例输入
const obj = { r: [1,2,3,4,5,6,7], p: [8,9,10,11,12,13,14], e: [15,16,17,18,19,20,21,22,23,24] }
示例输出(当 size=10 时)
const res = [ { r: [1,2,3,4,5,6,7], p:[8,9,10], }, { p:[11,12,13,14], e:[15,16,17,18,19,20] }, { e: [21,22,23,24] } ]
实现函数
const splitArray = (obj, size) => { // 把每个属性转换成带剩余数组的对象,方便追踪未处理元素 const sources = Object.entries(obj).map(([key, arr]) => ({ key, remaining: [...arr], total: arr.length })); const result = []; // 只要还有未处理的元素就继续拆分 while (sources.some(item => item.remaining.length > 0)) { const currentChunk = {}; let currentElementCount = 0; // 遍历所有还有剩余元素的属性,往当前块里加元素 for (const source of sources) { if (source.remaining.length === 0) continue; // 计算当前块还能容纳多少元素 const availableSlots = size - currentElementCount; if (availableSlots <= 0) break; // 取能加的最大元素数量 const takeCount = Math.min(availableSlots, source.remaining.length); const chunk = source.remaining.splice(0, takeCount); currentChunk[source.key] = chunk; currentElementCount += takeCount; } result.push(currentChunk); } return result; };
代码逻辑说明
- 先把原对象的每个属性转换成包含键、剩余数组的结构,方便后续追踪哪些元素还没处理。
- 循环处理直到所有属性的剩余数组为空:
- 每次新建一个空对象作为当前拆分块。
- 遍历还有剩余元素的属性,计算当前块还能装多少元素,从剩余数组里取出对应数量的元素加入当前块。
- 当当前块元素总数达到
size上限时,停止添加,把当前块放进结果数组。
- 最后返回拆分好的对象数组。
测试示例
const obj = { r: [1,2,3,4,5,6,7], p: [8,9,10,11,12,13,14], e: [15,16,17,18,19,20,21,22,23,24] }; console.log(splitArray(obj, 10)); // 输出结果与示例一致
内容的提问来源于stack exchange,提问作者Santhosh Kumar
相关产品推荐
相关产品推荐

