首页 > 其他分享 >JS数组指针prev、current、next的实现方式,涉及是否删除当前元素的情况分析

JS数组指针prev、current、next的实现方式,涉及是否删除当前元素的情况分析

时间:2024-09-29 10:37:42浏览次数:1  
标签:INDEX JS list value next current prev

背景

由于业务,需要做一个循环切换的轮播图效果,循环展示列表中的每个item,但是由于切换(从左往右移动,遇到末尾则跳到开头)的过程中可能会删掉当前元素,所以需要更新下标后再切换。由于涉及到几个临界条件,这里列出来处理方式,以便后续参考。

代码

这里给出的简化过后的代码:

<template>
  <el-switch v-model="isHold" label="保留"></el-switch>
  <el-button @click="handleIndexSwitch()">切换</el-button>
</template>

<script setup>
import { ref, onMounted } from "vue";
import { getListApi } from "@/api/list";

const isHold = ref(false); // 页面里面有个开关,是否在切换后删除当前item
const list = ref([]);
const currentItem = ref();
const INDEX = ref({
  prev: null,
  current: null,
  next: null,
});

onMounted(() => {
  getList();
});

function getList() {
  getListApi().then((res) => {
    let result = res.data.data;
    // 初始化下标
    switch (result.length) {
      case 1:
        INDEX.value = {
          prev: null,
          current: 0,
          next: null,
        };
        break;
      case 2:
        INDEX.value = {
          prev: 1,
          current: 0,
          next: null,
        };
        break;
      default:
        INDEX.value = {
          prev: result.length - 1,
          current: 0,
          next: 1,
        };
        break;
    }

    list.value = result;
    currentItem.value = result[INDEX.value.current];
  });
}

/**
 * 处理请求列表的切换 (保留|不保留)
 */
function handleIndexSwitch() {
  if (!list.value.length) return;

  /** 不保留,则把当前的item删掉,然后重新计算prev、current和next的指针指向 */
  if (!isHold.value) {
    // 删除当前项
    list.value.splice(INDEX.value.current, 1);

    if (list.value.length === 0) {
      currentItem.value = null;
      getList();
      return;
    }

    switch (list.value.length) {
      case 1:
        INDEX.value = {
          prev: null,
          current: 0,
          next: null,
        };
        break;
      case 2:
        INDEX.value = {
          prev: 1,
          current: 0,
          next: null,
        };
        break;
      case 3:
        INDEX.value = {
          prev: 2,
          current: 0,
          next: 1,
        };
        break;
      default:
        if (INDEX.value.current === 0) {
          INDEX.value = {
            prev: list.value.length - 1,
            current: 0,
            next: 1,
          };
        } else if (INDEX.value.current === list.value.length - 1) {
          INDEX.value = {
            prev: INDEX.value.prev - 1,
            current: list.value.length - 1,
            next: INDEX.value.prev,
          };
        } else {
          INDEX.value = {
            prev: INDEX.value.prev,
            current: INDEX.value.next,
            next:
              INDEX.value.next + 1 === list.value.length
                ? 0
                : INDEX.value.next + 1,
          };
        }
        break;
    }
  } else {
    /** 保留,则切换下一个 */
    switch (list.value.length) {
      case 1:
        INDEX.value = {
          prev: null,
          current: 0,
          next: null,
        };
        break;
      case 2:
        /** 调换一下顺序? */
        INDEX.value = {
          prev: INDEX.value.current,
          current: INDEX.value.prev,
          next: null,
        };
        break;
      default:
        INDEX.value = {
          prev: INDEX.value.current,
          current: INDEX.value.next,
          next:
            INDEX.value.next + 1 === list.value.length
              ? 0
              : INDEX.value.next + 1,
        };
        break;
    }
  }

  currentItem.value = list.value[INDEX.value.current];
  isHold.value = true;
}
</script>

情况分析

一共有两大类:保留(不删除当前元素,直接更新指针),不保留(删除这个元素,更新list,然后根据规则进行更新指针)

1. 不保留当前项

splice后,数组长度更新了,有以下的情况:

  1. 新列表长度为1:那么让current为0,prevnext为null即可。
  2. 新列表长度为2prev 指向1,current 设置为0,nextnull
  3. 新列表长度为3prev 为2,current 为0,next 为1。(这个不写也可以,按照第四种的情况进行处理也是这个结果)
  4. 新列表长度大于3
    41. current位于list头部current 不变仍为0prevlist.length - 1,如果 next 的值与 新的prev 一样,则 nextnull
    42. current位于list中间currentnext 移动到下一位,prev不变,如果新的 nextprev 一样,则 nextnull
    43. current位于list尾部currentlist.length - 1prev原prev值 - 1,如果 next 的值和 新的prev 一样,则 nextnull

2. 保留当前项

数组长度没变化,那么有下面的情况:

  1. 列表长度为1:那么让current为0,prevnext为null即可。
  2. 列表长度为2:切换顺序,prevcurrent 对调,nextnull
  3. 列表长度大于2
    • prev: 变为 原current 的值;
    • current: 变为 原next 的值;
    • next原next值 + 1 后是否触达数组末尾,若是则设为 0,不是则设为 原next值 + 1

标签:INDEX,JS,list,value,next,current,prev
From: https://www.cnblogs.com/crispyChicken/p/18439077

相关文章

  • 安装个人网盘NextCloud
    #查询nextcloud镜像[root@docker~]#dockersearchnextcloudNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDnextcloudAsafehomeforallyourdata3113......
  • HarmonyOS NEXT 全面升级:华为引领智能生态的未来
    随着科技的飞速发展,操作系统在智能设备中的地位愈发重要。华为最新推出的HarmonyOSNEXT系统,以其卓越的性能和创新的功能,正在重新定义智能生态的未来。本文将深入探讨HarmonyOSNEXT的核心技术、主要特性及其在智能设备中的应用,帮助您全面了解这一令人期待的操作系统升......
  • 【2024计算机毕业设计】基于jsp+mysql的JSP酒店预定管理系统
    运行环境:最好是javajdk1.8,我在这个平台上运行的。其他版本理论上也可以。IDE环境:Eclipse,Myeclipse,IDEA或者SpringToolSuite都可以,如果编译器的版本太低,需要升级下编译器,不要弄太低的版本tomcat服务器环境:Tomcat7.x,8.x,9.x版本均可操作系统环境:WindowsXP/7......
  • 【2024计算机毕业设计】基于JSP酒店预定管理系统
    运行环境:最好是javajdk1.8,我在这个平台上运行的。其他版本理论上也可以。IDE环境:Eclipse,Myeclipse,IDEA或者SpringToolSuite都可以,如果编译器的版本太低,需要升级下编译器,不要弄太低的版本tomcat服务器环境:Tomcat7.x,8.x,9.x版本均可操作系统环境:WindowsXP/7......
  • 2024全网最为详细的红帽系列(1)【RHCE-LJS之Linux高端骚操作实战篇】保姆级别实战教程
    欢迎各位彦祖与热巴畅游本人专栏与博客你的三连是我最大的动力以下图片仅代表专栏特色 专栏跑道一 ➡️ MYSQLREDISAdvanceoperation专栏跑道二➡️ 24NetworkSecurity-LJS ​​ ​专栏跑道三➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]​......
  • 基于nodejs+vue心里咨询与诊断平台系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着社会节奏的加快与生活压力的增大,心理健康问题日益凸显,成为影响公众生活质量的重要因素。传统心理咨询服务受限于地域、时间以及资源分配不均等问题,难以......
  • 基于nodejs+vue鞋类秒杀商城[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的日益普及,线上购物已成为现代人不可或缺的生活方式之一。在鞋类消费领域,消费者对于时尚、品质与性价比的追求日益增强,......
  • 基于nodejs+vue携手助学助学交流平台[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在当今社会,教育资源的不均衡分配问题日益凸显,尤其是在偏远地区及经济欠发达地区,优质教育资源的匮乏成为了制约学生成长与发展的关键因素。随着互联网技术的......
  • 基于nodejs+vue协同过滤音乐网站[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着数字音乐产业的蓬勃发展,音乐网站已成为人们日常生活中不可或缺的一部分。然而,面对海量的音乐资源,如何高效、精准地为用户推荐符合其个人喜好的音乐成为......
  • js 禁用开发者工具、js 禁用打印 pdf All In One
    js禁用开发者工具、js禁用打印pdfAllInOnedifficulty:Medium/难度:中等原理分析js检查浏览器是否打开了开发者工具,重定向到about:blank空白页js检测键盘所有按键事件,销毁页面,重定向到about:blank空白页demosconsturl=`https://cdn.xgqfrms.xyz/pdf.h......