首页 > 其他分享 >记录--前端实习生的这个 bug 被用做了一道基础面试题

记录--前端实习生的这个 bug 被用做了一道基础面试题

时间:2023-12-04 18:56:27浏览次数:24  
标签:index 面试题 const -- removeMultipleElement arr rowIndex 数组 bug

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

前言

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

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

具体 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

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

 

标签:index,面试题,const,--,removeMultipleElement,arr,rowIndex,数组,bug
From: https://www.cnblogs.com/smileZAZ/p/17875690.html

相关文章

  • xv6 file system
    xv6filesystem在我看来文件系统某种程度上是最复杂的一部分(单从页数也足以说明了),而且我对文件系统的了解其实很少,因此这部分仔细看了一下。xv6文件系统提供类似unix的文件、目录和路径名,并将其数据存储在virtio磁盘上以实现持久化。文件系统解决了几个挑战:文件系统需要......
  • Python 解析JSON实现主机管理
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示数据。JSON是一种独立于编程语言的数据格式,因此在不同的编程语言中都有对应的解析器和生成器。JSON格式的设计目标是易于理解、支持复杂数据结构和具有良好的可扩展性。JSON数据是......
  • C++:如何将 LLVM 嵌套到你的项目中去
    IDE:ClionLLVMcmake_minimum_required(VERSION3.9)project(clang_demo)find_package(LLVMREQUIREDCONFIG)message(STATUS"FoundLLVM${LLVM_PACKAGE_VERSION}")message(STATUS"UsingLLVMConfig.cmakein:${LLVM_DIR}")......
  • 电动车以旧换新,如何计算旧电瓶的折价 All In One
    电动车以旧换新,如何计算旧电瓶的折价AllInOne电动车更换电瓶,旧电瓶到底值多少钱?电池基本常识铅酸电池/石墨烯电池/锂电12V一块电池48V电池组包含四块电池一组60V电池组包含五块电池一组72V电池组包含六块电池一组demos旧电瓶的折旧费48V20A=230元=......
  • CCFCSP2305
    写在前面CSP(计算机软件能力认证考试),主要覆盖大学计算机专业所学习的程序设计,数据结构,算法以及相关的数学基础知识。包括但不限于:程序设计基础:    逻辑与数学运算,分支循环,过程调用(递归),字符串操作,文件操作,etc.数据结构:    线性表(数组,队列,栈,链表),树(堆,排序二叉树),哈希......
  • 【python入门之文件操作】---文件操作
    【一】文本处理引入应用程序运行过程中产生的数据最先都是存放于内存中的若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统......
  • 文件操作
    文件操作(1)文本处理引入应用程序运行过程中产生的数据最先都是存放于内存中的。若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统。而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念。用户或应用程序对文件的操作,就是向操作系统发起调用,然后......
  • 【python入门之文字符编码】---字符编码
    简介计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过......
  • 【python基础之可变和不可变数据类型】---python之栈的介绍
    【二】栈【0】引入https://www.hello-algo.com/chapter_stack_and_queue/栈如同叠猫猫,而队列就像猫猫排队。两者分别代表着先入后出和先入先出的逻辑关系。【1】栈的介绍「栈stack」是一种遵循先入后出的逻辑的线性数据结构。我们可以将栈类比为桌面上的一摞盘......
  • DMA传输数据
    前言  DMA即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。本篇文章以STM32F4为例,不同型号可能略有不同。一.DMA特性简介  STM32F4有......