在循环数组时使用splice()方法删除数组遇到的问题

在开发的时候,常常须要操做数据。须要将数组中某些目标元素删除时遇到了一些问题:

假设咱们有一我的员数组person,须要将元素里面age>18的元素删除数组

let person=[
    {name:"lilei",age:"45"},
    {name:"hanmeimei",age:"16"},
    {name:"rose",age:"18"},
    {name:"jack",age:"22"},
    {name:"david",age:"25"},
    {name:"bruce",age:"30"},
    {name:"roby",age:"26"},
    {name:"TMC",age:"11"},
    {name:"lee",age:"40"},
]
复制代码

如今咱们使用forEach方法循环而后删除对应的目标元素函数

person.forEach((value,index)=>{
    if(value.age>18){
        person.splice(index,1)
    }
})
复制代码

咱们看看输出结果是什么: 测试

奇怪,好像和咱们预想的结果不同,经过调试以后发现。每次执行一次splice方法以后,person的长度就会减一,从而会致使forEach循环中的下标错乱,最终达不到咱们的目标。

通过查询资料,能够经过如下方法来解决这个问题: 方法一:在每次执行splice方法以后都讲当前循环的下标值减1,此方法在forEach方法中无效,至于具体缘由我也不清楚,请大佬指教。使用for循环实现 for(var i=0;i<person.length;i++){ if(person[i].age>18){ person.splice(i--,1) } } 输出结果:spa

和咱们预想的结果一致

方法二:使用for循环逆向遍历.这种方法至关于每次执行splice方法的时候都将数组的长度减1调试

for(var i=person.length-1;i>-1;i--){
     if(person[i].age>18){
        person.splice(i,1)
    }
}
复制代码

输出结果:code

方法三:使用数组的filter方法。filter()方法使用指定的函数测试全部元素,返回一个包含全部经过的元素新的数组cdn

var newPerson=person.filter((p)=>p.age<=18)
复制代码

输出newPerson: blog

输出person:

数组按指定顺序排序

let obj=[
    {name:"test",age:18},
    {name:"test1",age:20},
    {name:"test2",age:25}
    ]
let arr=[25,18,20]
let result=[]
for(let i=0;i<arr.length;i++){
    result=result.concat(obj.filter(a=>a.age==arr[i]))
}
复制代码

输出结果: 排序

相关文章
相关标签/搜索