在循環數組時使用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]))
}
複製代碼

輸出結果: 排序

相關文章
相關標籤/搜索