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

前言

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

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

欢迎关注公众号《前端界》,文章会同步更新,也可快速加入前端交流群!

具体 Bug 代码实现:

js 复制代码
const arr = [1,2,3,4,5,6,7];
const removeData = (rowIndexs:Array<number>)=>{
    if(Array.isArray(rowIndexs)){
        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的基础编写能力) 接下来介绍这几种方法,欢迎补充

方法一:先倒序后删除

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

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

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

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

js 复制代码
const arr = [1,2,3,4,5,6];
cons removeMultipleElement = (rowIndexs)=>{
    if(Array.isArray(rowIndexs)){
        arr =  arr.filter((_,index)=>!rowIndex.includes(index))
    }
}
removeMultipleElement([1,4]);
console.log(arr);

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

使用 reduceincludes 函数,也会生成新数组

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

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

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

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

方法五:标记删除法加 filter

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

js 复制代码
const arr = [1,2,3,4,5,6];
cons removeMultipleElement = (rowIndexs)=>{
   const markedForDeletion = new Array(arr.length).fill(false);
   for(const index of rowIndexs){
       markedForDeletion[index] = true;
   }
   arr = arr.filter((_,index)=>!markedForDeletion[index])
}
removeMultipleElement([1,4]);
console.log(arr);

总结

目前针对这道题函数删除一个数组中多个元素,传入的参数是一个数组索引总结了几种解法,也避免了最初的 bug,欢迎大家评论提供更多的方法。

欢迎关注公众号《前端界》,文章会同步更新,也可快速加入前端交流群!

如果有收获欢迎点赞,转发,收藏支持下

相关推荐
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
To_OC7 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn8 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker8 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜8 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
触底反弹8 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
武子康9 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
随心点儿9 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
一点一木9 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
沉默王二10 小时前
腾讯一面,我霸气反问:“你说你们在做Agent项目,说说 SubAgent、Plan 模式、Skill 调用这些你们都是怎么做的?”面试官一直在擦汗。。
面试·agent·ai编程