前端拆分订单生成PDF:递归函数栈溢出问题求助
订单商品分页拆分解决方案
原代码问题解析
- 参数传递错误:递归调用时遗漏了
pages参数,且参数顺序混乱,导致递归无法正确累积分页结果。 - 终止条件逻辑错误:判断
order.items.length <= end不符合分页逻辑,正确的终止条件应该是start超过商品列表长度时停止。 - 步长与需求不符:示例要求每组3条,但代码中使用
+=4,逻辑矛盾。 - 分页数据未累积:递归过程中没有将当前页数据合并到
pages数组,无法生成完整结果。
修复后的递归实现
const order = { name: 'services', items: ['a', 'b', 'c', 'd', 'e', 'f', 'g'], }; const paginate = (order, pageSize, pages = [], start = 0) => { const end = start + pageSize; const currentItems = order.items.slice(start, end); if (currentItems.length > 0) { pages.push({ name: order.name, items: currentItems }); return paginate(order, pageSize, pages, end); } return pages; }; // 调用示例:按每组3条拆分 const splitOrders = paginate(order, 3); console.log(splitOrders);
非递归实现(推荐,避免栈溢出)
如果订单商品数量极大,递归可能再次触发栈溢出,循环实现更稳妥:
const order = { name: 'services', items: ['a', 'b', 'c', 'd', 'e', 'f', 'g'], }; const paginate = (order, pageSize) => { const pages = []; const total = order.items.length; for (let start = 0; start < total; start += pageSize) { const end = start + pageSize; pages.push({ name: order.name, items: order.items.slice(start, end) }); } return pages; }; // 调用示例:按每组10条拆分(满足PDF分页需求) const splitOrders = paginate(order, 10); console.log(splitOrders);
代码说明
- 灵活配置分页大小:将
pageSize作为参数传入,需要每页10条时直接传10即可。 - 递归实现:利用默认参数初始化分页结果和起始索引,每次递归处理完当前页后,传递更新后的起始位置。
- 非递归实现:通过循环遍历截取商品区间,彻底规避栈溢出风险,适合大数据量场景。
内容的提问来源于stack exchange,提问作者user3347778
相关产品推荐
相关产品推荐

