JavaScript如何一次性展示几万条数据

发布时间 - 2026-01-11 00:26:12    点击率:

有一位同事跟大家说他在网上看到一道面试题:“如果后台传给前端几万条数据,前端怎么渲染到页面上?”,如何回答? 于是办公室沸腾了, 同事们讨论开了, 你一言我一语说出自己的方案。 有的说直接循环遍历生成html页面上;有的说应该用分页来处理;通过DOM操作到页面,势必导致页面运行出现卡顿, 为此我还特意写了一个 demo测试了一下, 代码如下

$.get("data.json", function (response) {
 //response里大概有13万条数据
 loadAll( response );
});
function loadAll(response) {
 var html = "";
 for (var i = 0; i < response.length; i++) {
  var item = response[i];
  html += "<li>title:" + item.title + " content:" + item.content + "</li>";
 }
 $("#content").html(html);
}

data.json中大概有13万条数据左右, 通过ajax获取数据后以最简单粗暴的方法展示数据,在chrome浏览器下, 刷新页面到数据显示,我心中默数, 整个过程大概花掉5秒钟左右的时间, 卡顿非常明显。 我大致观察了一下代码的运行时间,发现循环生成字符串这过程其实并不算太耗时, 性能瓶颈是在将html字符串到文档中这个过程上, 也就是 $("#content").html(html); 这句代码的执行, 毕竟有13万个li元素要被挺入到文档里面, 页面渲染速度缓慢也在情理之中。

既然一次渲染13万条数据会造成页面加载速度缓慢,那么我们可以不要一次性渲染这么多数据,而是分批次渲染, 比如一次10000条,分13次来完成, 这样或许会对页面的渲染速度有提升。 然而,如果这13次操作在同一个代码执行流程中运行,那似乎不但无法解决糟糕的页面卡顿问题,反而会将代码复杂化。 类似的问题在其它语言最佳的解决方案是使用多线程,JavaScript虽然没有多线程,但是setTimeout和setInterval两个函数却能起到和多线程差不多的效果。 因此,要解决这个问题, 其中的setTimeout便可以大显身手。 setTimeout函数的功能可以看作是在指定时间之后启动一个新的线程来完成任务。

$.get("data.json", function (response) {
  //response里大概有13万条数据
  loadAll( response );
});

function loadAll(response) {
  //将13万条数据分组, 每组500条,一共260组
  var groups = group(response);
  for (var i = 0; i < groups.length; i++) {
    //闭包, 保持i值的正确性
    window.setTimeout(function () {
      var group = groups[i];
      var index = i + 1;
      return function () {
        //分批渲染
        loadPart( group, index );
      }
    }(), 1);
  }
}

//数据分组函数(每组500条)
function group(data) {
  var result = [];
  var groupItem;
  for (var i = 0; i < data.length; i++) {
    if (i % 500 == 0) {
      groupItem != null && result.push(groupItem);
      groupItem = [];
    }
    groupItem.push(data[i]);
  }
  result.push(groupItem);
  return result;
}

var currIndex = 0;

//加载某一批数据的函数
function loadPart( group, index ) {
  var html = "";
  for (var i = 0; i < group.length; i++) {
    var item = group[i];
    html += "<li>title:" + item.title + index + " content:" + item.content + index + "</li>";
  }
  //保证顺序不错乱
  while (index - currIndex == 1) {
    $("#content").append(html);
    currIndex = index;
  }
}

以上代码大致的执行流程是

1. 用ajax获取到需要处理的数据, 共13万条

2. 将数组分组,每组500条,一共260组

3. 循环这260组数据,分别处理每一组数据, 利用setTimeout函数开启一个新的执行线程(异步),防止主线程因渲染大量数据导致阻塞。

loadPart函数中有这段代码

while (index - currIndex == 1) {
 $("#content").append(html);
 currIndex = index;
}

通过这种方式执行, 页面瞬间就刷出来了,不用丝毫等待时间。 从同步改为异步,虽然代码的整体资源消耗增加了, 但是页面却能瞬间响应, 而且, 前端的运行环境是用户的电脑,因此些许的性能损失带来的用户体验提升相对来说还是值得的。

虽然示例中提到的情况在现实环境中几乎不可能出现, 但是在我们平时的工作中总会有一些似是而非的场景出现, 利用里面的处理思路, 或许对我们解决问题会有一定的帮助。

ps:setTimeout并不算真正的多线程, 但是为了方便表达,便借用了线程一词

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# javascript 数据 展示  # 是在  # 多线程  # 的说  # 每组  # 来完成  # 却能  # 自己的  # 并不算  # 加载  # 瞬间  # 文档  # 运行环境  # 我还  # 也在  # 这么多  # 遍历  # 中有  # 大显身手  # 开了  # 有一定 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何快速建站并高效导出源代码?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  高端企业智能建站程序:SEO优化与响应式模板定制开发  新三国志曹操传主线渭水交兵攻略  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何为不同团队 ID 动态生成多个非值班状态按钮  Python高阶函数应用_函数作为参数说明【指导】  微信小程序 wx.uploadFile无法上传解决办法  如何在Ubuntu系统下快速搭建WordPress个人网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何实现多对多模型关联?(Eloquent教程)  制作公司内部网站有哪些,内网如何建网站?  深入理解Android中的xmlns:tools属性  使用Dockerfile构建java web环境  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  如何在新浪SAE免费搭建个人博客?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Python面向对象测试方法_mock解析【教程】  制作电商网页,电商供应链怎么做?  JS经典正则表达式笔试题汇总  大连网站制作公司哪家好一点,大连买房网站哪个好?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel如何处理和验证JSON类型的数据库字段  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  如何快速查询网站的真实建站时间?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  香港服务器网站推广:SEO优化与外贸独立站搭建策略  java获取注册ip实例  Laravel怎么实现验证码(Captcha)功能  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel如何实现一对一模型关联?(Eloquent示例)  JavaScript常见的五种数组去重的方式  香港网站服务器数量如何影响SEO优化效果?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Android 常见的图片加载框架详细介绍  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Linux网络带宽限制_tc配置实践解析【教程】  如何快速搭建高效香港服务器网站?  如何用低价快速搭建高质量网站?  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  独立制作一个网站多少钱,建立网站需要花多少钱?