每日 30 秒之 对海量数据进行切割

简介

把数组按指定大小进行分组,可以用于分页、数据切割、异步操作数据。

// 该源码来自于 https://30secondsofcode.org
const chunk = (arr, size) =>
  Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
    arr.slice(i * size, i * size + size)
  );

代码分析

Array.prototype.from 从一个类似数组或者可迭代对象中创建一个新的数组实例,类似数组 这个词可能很多人都不是很清楚,类似数组是 javascript 中一个神奇的对象,只要拥有 length 就算是类似数组了。

最常见的类似数组是函数中的 arguments 有长度和 arguments[0] 的调用方法,但是却没有数组的 push 等函数方法。利用 Array.prototype.from 则可以把 类似数组 转化为 数组。这个代码的巧妙之处在于用了 { length: 3 } 这样的对象来快速 生成数组,而 Array.prototype.from 的第二个参数会对刚生成的数组进行循环遍历相当于调用了 map

在循环遍历新生成数组时,使用了 Array.prototype.slice 的方法来实现了分割数据的效果,这个方法相当常用同学们可以记住它。

使用场景

假设现在有一个消息列表数组里面有一万条数据让你渲染到页面上,大部分人会直接遍历数组并拼接成 dom 一股脑的渲染到页面上,这样带来的后果是大量的 dom 操作会花费很多时间导致页面卡顿,且上下滑动页面时也会卡顿。

我们不妨换个角度来看这个问题无论是手机屏幕还是电脑屏幕用户可见的页面数据条目可能就十几条。那为什么我们要一次性渲染一万多条,而且用户也不见得会把所有数据都查看了。

那我们是否可以只渲染十几条数据,其他数据等用户滚动了某个高度时再进行下一个十几条数据的渲染。在分页操作中,chunk 就可以帮助我们快速的进行分页。

样式
.news > div {
    text-align: center;
    height: 50px;
}
结构
<!-- 用于标识到页面顶部了 -->
<div class="news-header"></div>
<!-- 新闻数据 -->
<div class="news"></div>
<!-- 用于标识到页面底部了 -->
<div class="news-footer"></div>
脚本
// 模拟生成 1万条数据,这里就利用了 Array.from 来快速生成数据
const originNews = Array.from(
    { length: 10000 },
    (v, k) => ({ content: `新闻${k}` })
)

// 需要插入的容器
const element = document.querySelector('.news')[0]

// 创建视图监听
const loadObserver = new IntersectionObserver((entries) => {
    // 如果不可见,就返回
    if (entries[0].intersectionRatio <= 0) {
        return;
    }

    // 判断是否有上一页和下一页
    const hasPrePage = page != 0
    const hasNextPage = page != news.length - 1

    const now = news[page]
    const pre = hasPrePage ? news[page - 1] : []
    const next = hasNextPage ? news[page + 1] : []

    // 传递锚点的坐标 和 当前页面显示的数据
    render(pre.length, [ ...pre, ...now, ...next ])
    
    // 判断是否需要翻页,且防止数组越界
    page = entries[0].target.className == 'news-footer' || page === 0
        ? (hasNextPage ? page + 1 : page)
        : (hasPrePage ? page - 1 : page)
}, { threshold: [1] })

// 设置监听
loadObserver.observe(document.querySelector('.news-header'))
loadObserver.observe(document.querySelector('.news-footer'))

// 根据当前页面高度和新闻高度算出每一页可以放几条数据
let pageNum = Math.ceil(document.body.clientHeight / 50)
let page = 0 // 当前显示了第几页的数据
let news = chunk(originNews, pageNum) // 分页后的数据

// 渲染新闻 并 跳转到锚点
function render(last, data) {
    element.innerHTML = ''

    data.forEach((i, v) => element.innerHTML += v == last
        ? `<div id="news-herf">${i.content}</div>`
        : `<div>${i.content}</div>`
    )

    window.location.href = "#news-herf"
}

打赏&联系

如果您感觉有收获,欢迎给我打赏,以激励我输出更多的优质内容。

打赏&联系

本文原稿来自 PushMeTop
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算框架,它基于底层大量物理服务器组成的集群来处理海量数据。 在传统的计算架构中,如果面对海量数据的处理,单台服务器的计算和存储能力会面临瓶颈,无法满足高性能和高可靠性的要求。而Hadoop通过搭建集群的方式,将大规模的数据分散存储在多台服务器上,同时将计算任务也划分为多个子任务,由集群中的服务器并行处理,从而实现海量数据的高效处理。 Hadoop集群由多台物理服务器组成,每一台服务器都具备计算和存储的功能,这些服务器分布在不同的地理位置,可以根据实际需求进行水平扩展,从而实现对海量数据的处理。 Hadoop的分布式存储组件HDFS(Hadoop Distributed File System)将海量数据划分为多个数据块,并将不同数据块复制到集群中的不同服务器上,以实现数据的冗余备份和容错性。 Hadoop的计算模型MapReduce将任务划分为不同的Map和Reduce阶段,并通过调度器将任务分发给集群中的服务器进行并行计算。Map阶段对数据进行初步处理和分解,Reduce阶段对Map的结果进行汇总和整合,最终得到处理完的结果。 通过Hadoop的分布式计算能力,可以利用集群中的多个服务器并行处理海量数据,提高数据处理的效率和吞吐量。同时,集群中的服务器之间可以互相协同,进行容错处理,提高系统的可靠性和稳定性。 总之,Hadoop基于底层大量物理服务器组成的集群可以高效地处理海量数据,提供高性能的计算和存储能力,适用于大数据分析、数据仓库等领域的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值