假設咱們有一我的員數組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]))
}
複製代碼
輸出結果: 排序