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

有一位同事跟大家说他在网上看到一道面试题:“如果后台传给前端几万条数据,前端怎么渲染到页面上?”,如何回答? 于是办公室沸腾了, 同事们讨论开了, 你一言我一语说出自己的方案。 有的说直接循环遍历生成html插到页面上;有的说应该用分页来处理;还有的说这个面试官是个白痴, 哪有后台传几万条数据给前端这种情况的;我仔细思考了一下,先不论后端到底会不会白痴到传几万条数据给前端,假如真碰到这种情况,那么如果前端获取到数据以后, 直接将数据转换成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;
}

是为了保证不同的线程中最终插入html到文档中时顺序的一致性, 不至于同时执行的代码在插入html时互相篡位。

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

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

### 回答1: 要用JavaScript导出5万条数据到Excel,可以按照以下步骤进行: 1. 首先,将这5万条数据存储在一个数组中,确保数据以适当的格式和结构保存。 2. 接下来,创建一个空的Excel文件,并添加必要的表头,以确保数据的正确性和可读性。 3. 使用JavaScript的第三方库,比如SheetJS或者xlsx-populate,来操作Excel文件。 4. 遍历数据数组,并使用库提供的方法,将数据逐行写入Excel文件中。 5. 根据需要,可以添加格式化选项,比如字体、颜色和边框等。 6. 最后,保存并下载生成的Excel文件。 需要注意以下几点以优化性能: - 尽量避免在循环中频繁操作Excel文件,可以先将数据写入内存中的缓冲区,然后一次性写入Excel文件。 - 可以使用异步编程技术,比如Promise或者async/await,来处理大量数据的导出过程,避免阻塞主线程。 - 如果实际需求允许,也可以将数据分批次导出,每次导出一部分数据,减少一次性写入大量数据所需的时间和资源。 以上是一种基本的方法,具体实现可能因项目需求和使用的库而有所差异。 ### 回答2: 要将5万条数据导出为Excel文件,可以使用JavaScript编程语言来实现。首先,需要安装和引入相关的库或插件,例如"xlsx"或"exceljs",这些库可以帮助我们在前端生成Excel文件。 接下来,我们需要获取和处理5万条数据。可以从后端获取数据,并使用Ajax请求将数据传输到前端。 一种方法是将数据分批处理,以避免内存占用过高导致程序崩溃。可以根据需要的分批大小(比如1000数据一批),使用循环或递归来分批处理数据。 对于每一批数据,可以使用库中提供的方法,将数据逐行写入Excel文件中。要注意的是,对于大量数据的导出,可能需要对数据进行分页处理,以避免Excel文件过大或无法打开的问题。 将所有数据处理完毕后,可以将生成的Excel文件下载到本地。可以使用适当的库或插件提供的方法,将生成的Excel文件设置为下载文件。 最后,需要进行适当的错误处理和异常处理,以确保程序的稳定性和可靠性。 总结起来,通过适当的库或插件,分批处理数据,并使用JavaScript编程语言生成Excel文件,最终实现将5万条数据导出为Excel文件的需求。 ### 回答3: 要用JavaScript导出5万条数据到Excel,可以使用以下步骤: 步骤1:获取需要导出的数据。可以通过AJAX请求从服务器获取数据,或者在前端定义一个包含需要导出的数据的数组变量。 步骤2:创建一个新的Excel文件和工作表。可以使用JavaScript库(如xlsx)来操作Excel文件,在浏览器中生成一个新的Excel文件和工作表。 步骤3:将数据导入Excel。使用循环来遍历数据数组,在循环中将每个数据项写入Excel的每个单元格。 步骤4:保存Excel文件。可以使用JavaScript库将生成的Excel文件保存为Excel格式(.xlsx或.xls)。 需要注意的是,导出大量数据到Excel文件可能会导致性能问题,因为JavaScript是在浏览器中执行的。一种解决方法是将数据分成小块进行分批处理,以减少内存占用和性能压力。 综上所述,使用JavaScript导出5万条数据到Excel,需要通过AJAX或数组获取数据,使用JavaScript库操作Excel文件,在循环中将数据写入Excel并保存。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值