JS逆序遍歷實現(xiàn)代碼
最常用的遍歷方式為for語句(也有遞歸、while方式)。當(dāng)我們遍歷一個數(shù)組的時候,我們一般會這么做:
var arr = [1,2,3,4,5,6,7,8,9,10];
for(var i=0,total=arr.length;i<total;i++){
console.log(i,arr[i]);
}
這就是最常用的遍歷方式:正序遍歷。它從數(shù)組的第一項依次走到最后一項。
那為什么今天小劇還會提到逆序遍歷呢?
這里不得不提下小劇寫的組件里最常用的一個模塊:events。用于創(chuàng)建自定義事件模型,處理事件的監(jiān)聽及觸發(fā),最簡單的發(fā)布訂閱(pub/sub)模式。因為最近發(fā)現(xiàn)存在內(nèi)存溢出的隱患,需要在原有的基礎(chǔ)上增加一個解除綁定的方法。
因為同一事件名的回調(diào)函數(shù)是放在同一數(shù)組中,解除綁定也只需要從數(shù)組中找到對應(yīng)的回調(diào)函數(shù)(同一回調(diào)函數(shù)可能綁定多次),并且移除即可。
很簡單的需求,于是很自然地寫出類似下面的代碼:
//移除數(shù)組中的2
var arr = [1,2,2,2,2,1,1,2,2];
for(var i=0,total=arr.length;i<total;i++){
if(arr[i] == 2){
//符合條件,移除
arr.splice(i,1);
}
}
console.log(arr);
很正常的代碼有木有,可最終輸出結(jié)果卻是:[1, 2, 2, 1, 1, 2],顯然執(zhí)行結(jié)果不符合預(yù)期。
問題出在哪兒呢?
仔細分析了一下,發(fā)現(xiàn)問題出在了每次匹配成功,執(zhí)行移除操作之后,都會跳過下一個待檢查項,因為數(shù)組中之后的每一項都向前上升一位。
找到了問題所在,改了下代碼,在執(zhí)行移除操作之后,調(diào)整序列索引index(i)。
//移除數(shù)組中的2
var arr = [1,2,2,2,2,1,1,2,2];
for(var i=0,total=arr.length;i<total;i++){
if(arr[i] == 2){
//符合條件,移除
arr.splice(i,1);
//調(diào)整序列索引
i = i-1;
}
}
console.log(arr);
問題解決了,但總感覺修改序列索引是件調(diào)戲for循環(huán)的事。于是靈光一閃,啪啪啪,敲出下面的代碼:
//移除數(shù)組中的2
var arr = [1,2,2,2,2,1,1,2,2];
for(var i = arr.length-1;i!=-1;i--){
if(arr[i] == 2){
//符合條件,移除
arr.splice(i,1);
}
}
console.log(arr);
遍歷的過程不變,唯一變化的是遍歷的順序變了,對了,還少了一個變量total。
好吧,我承認今天寫的東西很屌絲,但通過這個例子,給以后寫代碼的時候提了個醒,在遍歷過程中,如果涉及到修改數(shù)組本身(增刪),逆序遍歷是個比較保險的遍歷方式。
coding筆記,留給以后嘲笑自己!
轉(zhuǎn)載請注明來源:http://bh-lay.com/blog/148c07761fa
相關(guān)文章
JavaScript+node實現(xiàn)三級聯(lián)動菜單
這篇文章主要為大家詳細介紹了JavaScript+node實現(xiàn)三級聯(lián)動菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07詳談ES6中的迭代器(Iterator)和生成器(Generator)
下面小編就為大家?guī)硪黄斦凟S6中的迭代器(Iterator)和生成器(Generator)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07