这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

前言

测试发现了一个问题,简单描述问题就是通过函数删除一个数组中多个元素,传入的参数是一个数组索引。

然后发现实际效果有时删除的不是想要的内容。

具体 Bug 代码实现:

const arr = [1,2,3,4,5,6,7];
const removeData = (rowIndex:Array<number>)=>{
if(Array.isArray(rowIndex)){
rowIndex.forEach((index)=>{
arr.splice(index,1)
})
}
}
removeData([1,4]);
console.log(arr); // 输出结果 [1,3,4,5,7]
// 期望输出结果 [1,3,4,6,7]

上面代码出现问题的原因是 splice 会改变原始数组的,然后导致索引偏移,不知道有没有同学出过类似问题。

因为这个 bug 我发现有些同学基础该是比较差,导致一些不必要的问题,于是把它变成了一道基础面试题,注意考基础,同时删除数组中的多个元素利用索引数组有多少种方式,把可以想到的方法都写一下哦(其实不是为了难为人,知识想考察一下面试者javaScript的基础编写能力) 接下来介绍这几种方法,欢迎补充

方法一:先倒序后删除

这种方式将参数索引数组按照从大到小排序,避免了删除元素导致的索引偏移

const arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
// 先倒序
if(Array.isArray(rowIndex)){
rowIndex = rowIndex.sort((a,b)=>b-a);
rowIndex.forEach((rowIndex)=>{
arr.splice(rowIndex,1);
})
}
}
removeMultipleElement([1,4]);
console.log(arr);

方法二:使用filter生成新数组

使用 filter 生成新数组,并且结合 includes 。(注意 filter 过滤的内容是浅拷贝过程)

let arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
if(Array.isArray(rowIndex)){
arr = arr.filter((_,index)=>!rowIndex.includes(index))
}
}
removeMultipleElement([1,4]);
console.log(arr);

方法三:使用reduce生成新数组

使用 reduce 和 includes 函数,也会生成新数组

let arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
if(Array.isArray(rowIndex)){
arr = arr.reduce((prev,current,currentIndex)=>{
if(!rowIndex.includes(currentIndex)){
prev.push(current)
}
return prev
},[])
}
}
removeMultipleElement([1,4]);
console.log(arr);

方法四:生成新数组,判断用Set.has 替换 includes

仍然会生成新数组,只是 includes 判断使用 set.has 替换,set.has 判断会比 includes 的性能好一些,但是也要考虑数组数据量的大小,如果只是几个值,可以不考虑

let arr = [1,2,3,4,5,6];
let newArr = [];
const removeMultipleElement = (rowIndex)=>{
const rowIndexSet = new Set(rowIndex);
arr.forEach((item,index)=>{
if(!rowIndexSet.has(index)){
newArr.push(item)
}
})
}
removeMultipleElement([1,4]);
console.log(newArr);

方法五:标记删除法加 filter

创建一个与原始数组相同长度的布尔数组 markedForDeletion,用于标记需要删除的元素。然后,我们遍历索引数组,将对应的标记设置为 true。最后,我们使用 filter 方法创建一个新数组,只保留未被标记为删除的元素。

let arr = [1,2,3,4,5,6];
const removeMultipleElement = (rowIndex)=>{
const markedForDeletion = new Array(arr.length).fill(false);
for(const index of rowIndex){
markedForDeletion[index] = true;
}
arr = arr.filter((_,index)=>!markedForDeletion[index])
}
removeMultipleElement([1,4]);
console.log(arr)

本文转载于:

https://juejin.cn/post/7272290608655859731

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--前端实习生的这个 bug 被用做了一道基础面试题的更多相关文章

  1. geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践

    眼看就要端午节了,屌丝还在写代码,话说过节也不给轻松,折腾了一天终于解决了一个BUG,并完成了老板安排的求DEM坡度的任务,那么就分两段来表. 一.BUG调试 首先记录一天的BUG调试,简单copy了 ...

  2. 记录一次线上bug

    记录一次线上bug,总的来说就是弱网和重复点击.特殊值校验的问题. 测试场景一:        在3g网络或者使页面加载速度需要两秒左右的时候,输入学号,提交学生的缴费项目,提交完一个 学生的缴费后, ...

  3. Java已五年1—二本物理到前端实习生到Java程序员「回忆贴」

    关键词:郑州 二本 物理专业 先前端实习生 后Java程序员 更多文章收录在码云仓库:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 没有 ...

  4. 前端基础面试题(JS部分)

    1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...

  5. 遇到问题或bug时要做的事。

    1,做事细心,只有细心才能减少bug量,做总结. 2,开发中遇到bug和错误,第一要想到是程序代码的问题.而首先想到的不是其他问题(比如版本,框架或兼容问题等). 3,程序不能按照自己的意愿执行,时先 ...

  6. 前端基础面试题(js部分)

      前端基础面试题(JS部分)   1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String值类 ...

  7. 前端动态属性页面的 要用id做name 因为这样方便在提交表单时候取到值

    前端动态属性页面的 要用id做name 因为这样方便在提交表单时候取到值

  8. 前端布局常见IE6 bug的解决方法,清除浮动的几种方法以及各自的优缺点

    相信有很多前端的朋友再布局的时候经常面对IE6咬牙切齿,尤其是刚刚入行的朋友,在这里给大家一点常见问题的解决方案,希望对大家有所帮助 1)png24位的图片在iE6浏览器上出现背景,解决方案是做成PN ...

  9. 记录最近的几个bug

    记录最近出的几个bug connection reset by peer 最近服务器经常性的出现connection reset by peer的错误,开始我们只是以为小概率的网络断开导致的,可是随着 ...

  10. 记录一次.Net框架Bug发现和提交过程:.Net Framework和.Net Core均受影响

    SmtpClient一处代码编写错误导致异步发送邮件时DeliveryFormat配置项无法正确工作,异步操作已经完全不受我们设置属性控制了,UTF-8内容(如中文)转不转码完全看对方邮件服务器心情! ...

随机推荐

  1. RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能

    RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能 来源:ICLR'24 https://arxiv.org/pdf/2401.18059.pdf 随着 LLM 技术的发展,RAG 的价值也来 ...

  2. React中的纯组件

    React中的纯组件 React提供了一种基于浅比较模式来确定是否应该重新渲染组件的类React.PureComponent,通常只需要继承React.PureComponent就可以定义一个纯组件. ...

  3. 阿里OSS+PicGo+Typora图床设置使用

    1.首先下载Typroa和PicGo Typroa地址: 链接:https://pan.baidu.com/s/1M6_5o1PZyaGqOhSb4yvtmA 提取码:a1aj PicGo地址: 链接 ...

  4. C++ 多线程的错误和如何避免(6)

    加锁的临界区要尽可能的紧凑和小型 问题分析: 当一个线程在临界区内执行时,所有其他试图进入临界区的线程都会被阻止,所以我们应该保证临界区尽可能的小.比如, void CallHome(string m ...

  5. 负载均衡load balancing和算法分类概要介绍

    一.负载均衡介绍 1.1 什么是负载均衡 负载均衡(load balancing) 它是计算机的一种技术,用来在计算机集群.网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到优化资源使用.最大化 ...

  6. Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

    前言   编译ubuntu驱动之前,发现使用的gcc是7.3.0,而使用apt管理和下载的都无法直接或间接安装gcc7.3.0,于是只能从源码安装gcc7.3.0编译器.   GCC 概述   GCC ...

  7. OpenCV开发笔记(五十八):红胖子8分钟带你深入了解图像的矩(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  8. vscode中跑go test时打印详细信息配置

    1.文件>首选项>设置>搜索Test Flags 2.选择在settings.json中编辑 3.添加以下内容 "go.testFlags":[ "-v ...

  9. APScheduler可能遇到的问题

    uWsgi使用多进程模式启动Django项目,因此我们会有多个进程去执行这个定时任务,导致定时任务被重复执行.解决这个问题的方法,我们直接就会想到采用加锁的方式.第一个拿到锁的进程,执行定时任务,其余 ...

  10. 面向开发者的 ChatGPT 提示工程课程|吴恩达携手OpenAI 教你如何编写 prompt

    提示工程(Prompt Engineering)是一门相对较新的学科,旨在开发和优化提示,从而高效地将语言模型(LM)用于各种应用和研究主题,并帮助开发人员更好地理解大型语言模型(LLM)的能力和局限 ...