如何实现按指定数量拆分对象数组为二维数组(用于分页)
数组按指定数量分组的实现需求
给定如下对象数组:
[ { "id": "34285952", "labs": [ { "id": "13399-17", "location": "Gambia", "edge": ["5062-4058-8562-2942-2107-2064-58"] } ] }, { "id": "85130775", "labs": [ { "id": "52504-72", "location": "Nepal", "edge": [ "5232-9427-8339-7218-3936-9389-52", "6375-9293-7064-5043-6869-4773-65", "8547-4739-6334-3896-7208-8243-67" ] } ] }, { "id": "67817268", "labs": [ { "id": "17891-68", "location": "U.S.", "edge": [ "6383-7536-7257-4713-9494-9910-93", "6743-8803-1251-1173-5133-2107-19" ] } ] }, // 更多对象省略 ]
需要实现一个函数,接收数组和数字参数(比如10),将原数组按指定数量合并为二维数组。例如原数组有22个对象时,会拆分为3个数组(前两个各10个,最后一个2个)。
输入示例(8个空对象):
[ { }, { }, { }, { }, { }, { }, { }, { } ]
按数量2分组的输出示例:
[ [ { }, { } ], [ { }, { } ], [ { }, { } ], [ { }, { } ] ]
现有初步代码但逻辑不完整:
// array = 上述示例数组 // countOption = 10 const splitArrayByCount = (array, countOption) => { return array.map(object => { if (array.length > countOption) { return [object] } }) };
完整解决方案
可以通过循环遍历原数组,按指定数量截取子数组来实现,代码如下:
const splitArrayByCount = (array, countOption) => { // 处理边界情况:空数组直接返回空,分组数小于1时返回原数组的包装 if (!array.length) return []; if (countOption < 1) return [array]; const result = []; // 计算总组数,向上取整保证最后一组元素不足时也能被保留 const totalGroups = Math.ceil(array.length / countOption); for (let i = 0; i < totalGroups; i++) { const startIndex = i * countOption; // 截取当前组的子数组,slice超出数组长度时会自动取到末尾 const group = array.slice(startIndex, startIndex + countOption); result.push(group); } return result; };
代码说明
- 边界处理:提前过滤空数组和非法分组数量的情况,避免无效计算。
- 组数计算:用
Math.ceil计算总组数,确保哪怕最后一组元素数量不足指定值,也能单独成为一组。 - 子数组截取:通过
slice方法按索引范围截取元素,该方法不会修改原数组,且当结束索引超出数组长度时,会自动截取到数组末尾,适配最后一组的情况。
测试示例
// 测试8个元素按2分组 const testArray = [{}, {}, {}, {}, {}, {}, {}, {}]; console.log(splitArrayByCount(testArray, 2)); // 输出:[[{},{}], [{},{}], [{},{}], [{},{}]] // 测试22个元素按10分组 const longArray = Array.from({length:22}, (_, idx) => ({id: idx})); console.log(splitArrayByCount(longArray, 10)); // 输出:[[...10个元素], [...10个元素], [...2个元素]]
内容的提问来源于stack exchange,提问作者mrks
相关产品推荐
相关产品推荐

