JavaScript实战:探究数组循环截取的实现技巧

简介: 本文介绍如何使用JavaScript实现数组的循环截取功能,适用于视频列表轮播等场景。通过for循环和slice两种方法,每隔固定时间截取4个元素并循环滚动索引,保证无缝衔接。详细讲解实现思路、代码解析及两种方法的优劣对比,帮助开发者提升实际编码能力。

目录

前言

你好,我是喵喵侠。今天我收到了一个需求,有一个视频列表,页面上显示的布局是2x2,但后端返回的视频列表数据通常是大于4个的。也就是说,假设后端返回5条数据,默认先展示前4条,后面每隔固定时间(比方说10秒),切换下一组数据显示。如果超出边界,则索引从前面开始取值。这样描述可能不是特别清晰,下面我把需求进行举例拆解,一看就明白了。

需求拆解

假设有一个数组是[1,2,3,4,5,6,7,8,9],数组长度是9,每次都是截取4个元素,开始索引每次截取完成后会+4。具体的截取结果示例如下:

  • 第1次截取:[1,2,3,4]
  • 第2次截取:[5,6,7,8]
  • 第3次截取:[9,1,2,3]
  • 第4次截取:[4,5,6,7]
  • 第5次截取:[8,9,1,2]
  • ……

这样看就很清晰了,如果截取到后面数组元素不够了,就从前面取,保证一次取完4个就可以了,无限循环。

实现方法

for循环实现

你想要从一个数组中每隔10秒钟截取4个元素,并且索引循环滚动。例如,数组长度为9时,第一次取前4个,第二次从第5个开始取,之后再循环到开头。你可以通过以下方式实现这个需求:

实现思路

  1. 每次截取4个元素:可以使用 Array.prototype.slice() 来获取数组的子集。
  2. 滚动索引:利用模运算来实现索引的循环滚动(防止数组越界)。
  3. 定时器:使用 setInterval 每隔10秒执行一次截取操作。

代码实现

const arr = [
  { name: 'A', url: 'url1' },
  { name: 'B', url: 'url2' },
  { name: 'C', url: 'url3' },
  { name: 'D', url: 'url4' },
  { name: 'E', url: 'url5' },
  { name: 'F', url: 'url6' },
  { name: 'G', url: 'url7' },
  { name: 'H', url: 'url8' },
  { name: 'I', url: 'url9' }
];
let startIndex = 0;
const interval = 10 * 1000;  // 每隔10秒,这里用乘法,方便修改时间
function getNextFourElements(arr, startIndex) {
  const result = [];
  const len = arr.length;
  
  for (let i = 0; i < 4; i++) {
    const index = (startIndex + i) % len;  // 模运算实现索引滚动
    result.push(arr[index]);
  }
  
  return result;
}
// 定时器每隔10秒调用一次
setInterval(() => {
  const fourElements = getNextFourElements(arr, startIndex);
  console.log(fourElements);  // 输出当前4个元素
  startIndex = (startIndex + 4) % arr.length;  // 更新起始索引,滚动到下一个位置
}, interval);

代码解析

  1. getNextFourElements 函数用于获取从 startIndex 开始的4个元素。通过 (startIndex + i) % len 实现数组的索引滚动。
  2. 每次定时器触发时,startIndex 会更新为下一个位置的起点,继续截取4个元素。
  3. 通过 setInterval 实现每隔10秒输出结果。

示例输出

假设数组长度为9,输出会是这样的:

  • 第一次:A, B, C, D
  • 第二次:E, F, G, H
  • 第三次:I, A, B, C
  • 第四次:D, E, F, G
  • 第五次:H, I, A, B

这个方案保证了每次从数组中滚动截取4个元素,无论数组长度是多少,都能循环输出。

slice实现

使用 slice 来实现你的需求,同时考虑边界问题,可以通过判断 startIndex 和数组长度来处理数组的循环切片。以下是基于 slice 的实现:

实现思路

  1. slice** 切割数组**:如果 startIndex + 4 超过数组长度时,需要从数组头部补足剩余的元素。
  2. 边界处理:通过判断 startIndex + 4 是否超过数组长度,来决定是否需要从头开始截取。

代码实现:

const arr = [
  { name: 'A', url: 'url1' },
  { name: 'B', url: 'url2' },
  { name: 'C', url: 'url3' },
  { name: 'D', url: 'url4' },
  { name: 'E', url: 'url5' },
  { name: 'F', url: 'url6' },
  { name: 'G', url: 'url7' },
  { name: 'H', url: 'url8' },
  { name: 'I', url: 'url9' }
];
let startIndex = 0;
const interval = 10 * 1000;  // 每隔10秒
function getNextFourElements(arr, startIndex) {
  const len = arr.length;
  let result = [];
  
  if (startIndex + 4 <= len) {
    // 如果从 startIndex 开始截取4个元素不会越界
    result = arr.slice(startIndex, startIndex + 4);
  } else {
    // 如果越界了,需要从头开始补齐
    const firstPart = arr.slice(startIndex, len); // 从 startIndex 到数组末尾
    const secondPart = arr.slice(0, (startIndex + 4) % len); // 从数组开头补齐
    result = firstPart.concat(secondPart);
  }
  return result;
}
// 定时器每隔3秒调用一次
setInterval(() => {
  const fourElements = getNextFourElements(arr, startIndex);
  console.log(fourElements);  // 输出当前4个元素
  startIndex = (startIndex + 4) % arr.length;  // 更新起始索引,循环滚动
}, interval);

代码解析

  1. 切割逻辑
  • 如果 startIndex + 4 不超过数组长度,则直接用 slice 截取从 startIndex 开始的4个元素。
  • 如果 startIndex + 4 超过数组长度,则通过两次 slice 操作:第一次从 startIndex 到数组末尾,第二次从数组头部截取剩下的元素。
  1. 索引更新:每次更新 startIndex 时,使用模运算 startIndex = (startIndex + 4) % arr.length 保证它在数组长度内循环。

示例输出

假设数组长度为9,输出会是这样的:

  • 第一次:A, B, C, D
  • 第二次:E, F, G, H
  • 第三次:I, A, B, C
  • 第四次:D, E, F, G
  • 第五次:H, I, A, B

这个实现基于 slice 方法,确保了每次从数组中正确地滚动截取4个元素,无论数组长度是多少,都能循环滚动。

两种方法对比

这里我简单画一个表格,来从代码简洁性、可读性、执行效率三个角度来看,哪种方法更优。

方法

代码简洁性

可读性

执行效率

for循环

起始索引递增取余数组长度十分巧妙,不需要关心是否越界,代码量更少

可读性略差,需要理解每一项循环取余的操作。

理论上每次执行只访问4次数组元素,数据量大执行效率会更高

slice方法

需要关心是否越界,需要手动拼接处理,代码较为冗余。

数组自带方法,逻辑更清晰,代码更简洁。

slice会返回新数组,可能会有额外开销

综上所述,我个人觉得for的方式更为巧妙,执行效率更高,以后可以采用这种方式。如果你对slice数组方法比较熟悉,数据量不大的情况下,用这种方式实现,可读性会更好,更容易让人明白意图。

总结

通过这个实际需求,相信你学会了如何用JavaScript循环截取指定长度的数组,一开始看代码理解会有点点绕,多看几遍就好了。希望你可以把这个技巧用到你的工作中去,后面我会分享更多JavaScript实际案例技巧。

目录
相关文章
|
5月前
|
缓存 JavaScript 前端开发
Vue的生命周期详解及业务场景应用
本文详细介绍Vue.js的生命周期概念及各阶段钩子函数的作用,结合实际业务场景讲解如何合理使用created、mounted、updated等钩子进行数据初始化、DOM操作、资源清理等,帮助开发者提升组件管理能力与代码性能。
218 0
Vue的生命周期详解及业务场景应用
|
JavaScript 前端开发
JS 下载 URL 链接文件(点击按钮、点击a标签、支持代理与非代理下载)
JS 下载 URL 链接文件(点击按钮、点击a标签、支持代理与非代理下载)
1826 0
|
3月前
|
消息中间件 存储 调度
RocketMQ 两大核心特性深度拆解:事务消息与延时消息,从原理到实战全打通
RocketMQ作为阿里开源的金融级消息中间件,以高可靠、高吞吐、低延迟著称。其事务消息通过两阶段提交+回查机制,解决本地事务与消息发送的原子性问题;延时消息在5.x中升级为毫秒级任意时间定时消息,基于TimerStore与时间轮实现高性能调度,二者共同支撑分布式系统核心一致性与定时场景。
427 1
|
5月前
|
安全 网络安全 开发工具
解决 Host key verification failed 报错的三种方法(含 SSH 安全建议)
本文由喵喵侠撰写,详解Git提交时常见报错“Host key verification failed”的成因与解决方案。当SSH密钥变更或服务器重装系统时,本地记录的主机密钥会失效,导致连接被拒。文章提供三种解决方法:使用`ssh-keygen -R`删除旧密钥、手动编辑`known_hosts`文件,或临时禁用严格检查(不推荐生产环境)。同时强调安全建议:确认服务器状态、核对密钥指纹、启用`VerifyHostKeyDNS`防范中间人攻击。帮助开发者快速定位问题,保障代码提交顺畅。
2402 0
|
5月前
|
自然语言处理 前端开发 Windows
推荐一款很好用的VSCode变量翻译插件
本文介绍VSCode插件“var-translate-en”,可一键将中文翻译为英文并转为小驼峰等命名格式,支持百度、腾讯、阿里等翻译服务。通过简单配置与快捷键设置,提升变量命名效率,解决命名难题。
2045 0
|
6月前
|
运维 安全 Devops
生产环境缺陷管理
git-poison基于go-git实现,通过“投毒-解毒-银针”机制,自动化追踪与管理多分支环境下的bug修复,避免人为疏漏导致的生产事故,降低协同成本,提升发布安全与效率。
 生产环境缺陷管理
|
人工智能 自然语言处理 数据可视化
中国版“Manus”开源?AiPy:用Python重构AI生产力的通用智能体
AiPy是LLM大模型+Python程序编写+Python程序运行+程序可以控制的一切。
1047 11
|
传感器 运维 物联网
蓝牙Mesh网络:连接未来的智能解决方案
蓝牙Mesh网络:连接未来的智能解决方案
3167 12
|
自然语言处理 数据挖掘
数据特征包括分布特征、统计特征、对比特征、帕累托特征和文本特征
数据特征包括分布特征、统计特征、对比特征、帕累托特征和文本特征
1322 31