Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript实战:探究数组循环截取的实现技巧

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

原创
作者头像
喵喵侠
发布于 2024-09-13 11:19:16
发布于 2024-09-13 11:19:16
20900
代码可运行
举报
运行总次数:0
代码可运行

目录

前言

你好,我是喵喵侠。今天我收到了一个需求,有一个视频列表,页面上显示的布局是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秒执行一次截取操作。
代码实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 是否超过数组长度,来决定是否需要从头开始截取。
代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 到数组末尾,第二次从数组头部截取剩下的元素。
  2. 索引更新:每次更新 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实际案例技巧。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript之数组
Array在JavaScript里面很常用,讲真的,平时开发除了循环数组和push数组之外,对于数组的其他方法和属性几乎都是用到的时候百度。今天自己整理一些数组的概念和方法,希望自己能记住,也为了以后使用的时候有地方直接查看。当然,太基础的东西就不说了。
wade
2020/04/23
4260
前端模拟面试:7个JavaScript数组进阶面试题
你坐在面试室里,对面的面试官微笑着,轻敲着桌面问道:“那我们来聊聊 JavaScript 吧。数组操作你有多熟悉?”你意识到,眼前这个问题看似简单,但面试官可能在考察你对 JavaScript 基础知识的深度掌握和灵活运用。你深吸一口气,准备好好展示一番,从最常见的查找最大值问题入手,一步步展示自己的思路。
前端达人
2024/11/25
1470
前端模拟面试:7个JavaScript数组进阶面试题
06_JavaScript数组
保存一个班级学生信息,每个数组元素都代表一个学生,而每个学生都使用一个一维数组分别表示其姓名、学号、年龄等信息,这样通过一个变量即可有规律的保存一个班级的所有学生信息,方便开发时进行处理。
张哥编程
2024/12/13
2080
数组旋转,来来来,走个K步~
在前端算法面试中,数组是经常被问到的、使用到的。今天我们来看一道经典的前端基础面试题:【数组旋转K步】。
胡哥有话说
2022/08/30
4610
数组旋转,来来来,走个K步~
JavaScript初探 三 (学习js数组)
JavaScript初探 (三) JavaScript数组 定义 创建数组 var 数组名 = [元素0,元素1,元素2,……] ; var arr = ["Huawei","China","Mirror"]; 同时JavaScript也支持 new Array 创建数组。但是建议使用上面的文本方式创建数组 数组访问 通过引用 索引号(下标) 来引用某个数组元素 var name = arr[0]; // name = Huawei ps:数组的索引是从 0 开始的 可以直接使用数组名不加索引属
Mirror王宇阳
2020/11/13
1.8K0
JavaScript初探 三 (学习js数组)
原生JS灵魂之问,看看你是否熟悉JavaScript?
笔者最近在对原生JS的知识做系统梳理,因为我觉得JS作为前端工程师的根本技术,学再多遍都不为过。打算来做一个系列,一共分三次发,以一系列的问题为驱动,当然也会有追问和扩展,内容系统且完整,对初中级选手会有很好的提升,高级选手也会得到复习和巩固。这是本系列的第二篇。
ConardLi
2019/11/12
1.4K0
原生JS灵魂之问,看看你是否熟悉JavaScript?
JavaScript数组
JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。 要取得Array的长度,直接访问length属性:
用户3519280
2023/07/07
2290
原生JS | 随机抽取不重复的数组元素 —— 有没有更好的方法?
HTML5学堂-码匠:从数组中随机抽取不重复的元素,构成新数组,拥有多种方法,来看看你用的方法性能如何? 效果的功能需求 从一个数组当中,随机抽取数个元素,构成新数组,要求这些元素不能重复。(即随机获取不重复的数组元素) 相关说明:在此处依照“构思难度”和“性能”两方面出发,提供了四种不同的实现方法。 方法1:较为“传统”的实现方法 基本实现思路 从第二次随机抽取的元素开始,需要将抽取的元素与当前新数组的已抽取元素相比较,如果相同,则重新抽取,并再次执行比较的操作。 代码实现 var arr = [0, 1
HTML5学堂
2018/03/13
9.7K1
原生JS | 随机抽取不重复的数组元素 —— 有没有更好的方法?
前端js手写题经常忘,记录一下
使用时间戳的节流函数会在第一次触发事件时立即执行,以后每过 wait 秒之后才执行一次,并且最后一次触发事件不会被执行
helloworld1024
2022/09/23
1K0
前端高频手写面试题总结
输入字符串s,以及其重复的次数,输出重复的结果,例如输入abc,2,输出abcabc。
helloworld1024
2022/12/12
2.3K0
javascript数组怎么定义_js中的数组
每一门编程语言,都有数组或类似数组的结构,同样的JavaScript(虽然是脚本语言)也不例外,学习JavaScript的数组,我们从新建第一个数组开始:
全栈程序员站长
2022/11/10
4K0
javascript数组怎么定义_js中的数组
图解LeetCode——658. 找到 K 个最接近的元素(难度:中等)
给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。
爪哇缪斯
2023/05/10
3010
图解LeetCode——658. 找到 K 个最接近的元素(难度:中等)
算法题之数组连续筛选处理
大体思路就是循环遍历,每次遍历判断当前项是否与前一项差值为1,这里需要考虑若结果为1,如何处理,结果不为1如何处理。
挥刀北上
2019/07/19
7280
算法题之数组连续筛选处理
React技巧之中断map循环
原文链接:https://bobbyhadz.com/blog/react-map-break[1]
chuckQu
2022/08/19
5710
JavaScript数组创建及常见方法汇总(修订版)
插入:可以向指定位置插入任意数量的元素,需要提供3个参数:起始位置、0(要删除的元素数量)、插入的元素
用户1272076
2019/03/26
4220
Javascript数组操作
使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间;思虑下,堪能如此继续之?当狠心深学下方是正道。 一, 数组常用方法 1. 数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度 var arrayObj = new Array([element0[, element1
晚晴幽草轩轩主
2018/03/27
4K0
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】
数组基本操作可以归纳为增、删、改、查,需要留意的是哪些方法会对原数组产生影响,哪些方法不会
HelloWorldZ
2024/03/20
3840
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】
精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解
该项目来自于 Github 用户 Chalarangelo,目前已在 Github 上获得了 5000 多Star,精心收集了多达 48 个有用的 JavaScript 代码片段,该用户的代码可以让程序员在 30 秒甚至更少的时间内理解这些经常用到的基础算法,来看看这些 JavaScript 代码都传达出了什么吧! Anagrams of string(带有重复项) 使用递归。对于给定字符串中的每个字母,为字母创建字谜。使用map()将字母与每部分字谜组合,然后使用reduce()将所有字谜组合到一个
前端教程
2018/03/05
2.1K0
精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解
盘盘项目中你常用到的数组API
数组在业务中是一个非常高频的API,在业务中基本都有用它,必不可少,本文是笔者一篇关于数组常用API的总结,希望看完在项目中有所帮助。
Maic
2022/12/21
5860
盘盘项目中你常用到的数组API
js取数组截取
splice()会删除选定的数组,slice()只会进行选定,pop选定最后一个元素删除并返回最后一个元素的值,length函数判断数组的长度,使用slice选取 单个值的时候记得返回的是一个数组类型。
全栈程序员站长
2022/08/15
11.1K0
推荐阅读
相关推荐
JavaScript之数组
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验