我在一个前端工作,在那里我收到来自数据库的订单,我需要生成一个PDF,但每页只有10个项目.我需要生成一个具有相同属性但每个具有10个项目的订单列表,直到原始订单项目列表完成.

下面是一个例子:

const order = {
    name: 'services',
    items: ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
}

const paginate = (order, pages, start, end) => {

    if (order.items.length <= end) {
        return pages.concat({
            name: order.name,
            items: order.items.slice(start, end)
        })
    } else {
        start += 4
        end += 4
        paginate(order, start, end)
    }

}

但这给了我超出最大调用堆栈大小的错误.在本例中,我try 将订单拆分为3个项目.任何帮助都是非常好的.

推荐答案

你需要在你的代码中解决一些问题,比如:

  1. 你必须更新递归调用中的pages参数,但你没有这样做.
  2. 此外,我不确定为什么startend的增量硬编码值为4,尽管您提到要将订单分成3个项目.

My approach:

  1. As a base(terminating) case, check if the start <= length of items.
    1.1. If yes, return the pages array.
  2. 计算当前呼叫的结束时间.
  3. 更新pagesarray.
  4. 使用更新后的endpages数组进行递归调用.

const order = {
  name: 'services',
  items: ['a', 'b', 'c', 'd', 'e', 'f', 'g'],
}
// Time complexity: O(n), n being #of items in the order.items array.
const paginate = (order, itemsPerPage, start = 0, pages = []) => {
  // base case
  if (start >= order.items.length) {
    return pages; // Space Complexity O(n) for pages + depth of call stack used ~ O(n)
  }
  const end = start + itemsPerPage;
  pages.push({
    name: order.name,
    items: order.items.slice(start, end)
  });
  return paginate(order, itemsPerPage, end, pages);
}
const paginatedOrders = paginate(order, 3); // <-- update to 4 if you need that
console.log(paginatedOrders);

SIDENOTE:

正如您所看到的,它是尾递归代码(尽管编译器在幕后对它们进行了优化),为它编写迭代方法会更容易.虽然在使用迭代方法时可以节省堆栈空间,但时间和空间复杂度的渐近仍然是102,在递归代码中,迭代方法接近101.

Javascript相关问答推荐

如何在加载的元数据上使用juserc和await中获得同步负载?

强制执行useStatego struct 化变量[foo,setFoo]的命名约定?

通过实现regex逻辑自定义数据表搜索

Express.js:使用Passport.js实现基于角色的身份验证时出现太多重定向问题

仅在React和JS中生成深色

如何避免移动设备中出现虚假调整大小事件?

模块与独立组件

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

我开始使用/url?q=使用Cheerio

Angular中计算信号和getter的区别

扫描qr code后出错whatter—web.js

将本机导航路由react 到导航栏中未列出的屏幕?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

如何在JAVASCRIPT中临时删除eventListener?

在画布中调整边上反弹框的大小失败

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

在SuperBase JS客户端中寻址JSON数据

FireBase FiRestore安全规则-嵌套对象的MapDiff

为什么我不能使用其同级元素调用和更新子元素?

如何使用Cypress在IFRAME中打字