前端

数组元素删除

2022-06-10  本文已影响0人  玩滑板的小王

关键词:Array数组删除多个元素、JS、倒序删除

背景🤺

删除数组中特定条件的元素(可能存在多个)_JS实现。
实际业务场景为 为用户分配对应维度权限时,通过checkbox点选更新原权限数组(需删除相关子权限),但发现有些子权限未被删除。

错误思路🤡

判断数组中符合条件的元素,直接splice()删除

let arr = [100, 200, 300, 400, 500];
for(let i = 0; i < arr.length; i++){
    if(arr[i] > 300) {
       arr.splice(i ,1);
    }
}
console.log(arr);

执行结果:[100, 200, 300] ?
实际结果:[100,200,300,500],可能看到这个结果你就能想到原因了

原因:遍历至符合条件的元素 400 时,i 此时为3,执行splice()方法结束,i++变为4。进入下一轮循环,由于 400 被删除,arr.length由原长 5 变为 4,故并未继续进入循环,导致 500 未被删除。

改进思路🤖_临时变量存储数组初始长度

let arrLength = arr.length;

let arr = [100, 200, 300, 400, 500];
let arrLength = (arr.length);
for(let i = 0; i < arrLength; i++){
    if(arr[i] > 300) {
       arr.splice(i ,1);
    }
}
console.log('数组原始长度:', arrLength);
console.log('删除后的数组:', arr);

这下总该万无一失了吧🐶,然而:


运行结果_临时变量存储数组初始长度.png

原因:初始长度虽然拿到了,但是删除了 400 之后,500 的下标已经不是原来的 4 了,而是 3,所以就算判断 arr[4] 也是无意义的。
当然,每次删除元素之后,可以通过 i-1,来解决这个问题。

改进思路_倒序删除

let arr = [100, 200, 300, 400, 500];
for(let i = arr.length-1; i >= 0; i--){
    if(arr[i] > 300) {
       arr.splice(i ,1);
    }
}
console.log('删除后的数组:', arr);
运行结果_倒序删除.png

改进思路_JS_filter()过滤

let arr = [100, 200, 300, 400, 500];
for(let item in arr){
    arr = arr.filter(item => {
        return item <= 300;
    });
}
console.log('删除后的数组:', arr);

截图就不上了,和倒序删除正确结果一致。

总结👻

本文从数组删除元素遇到的实际问题,分析了数组长度、下标变化对遍历数组产生的影响,最后通过倒序删除、JS自带方法等不同方案解决问题。

小白踩坑之路,如有不当希望指出,若有好想法欢迎讨论👶

上一篇下一篇

猜你喜欢

热点阅读