国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JS的splice()方法在for循環中使用可能會遇到的坑

2019-11-08 19:53:15
字體:
來源:轉載
供稿:網友

在寫JS代碼時,我們常常使用 splice 函數來刪除數組中的元素,因為 splice 函數會直接對數組進行修改,從而不需再自己寫一個算法來移動數組中的其他元素填補到被刪除的位置。splice 功能十分強大,除了可以刪除數組的元素之外,還可以刪除的同時添加新的元素到刪除的位置等等用法。在本篇文章中,我只介紹 splice 的刪除數組元素的用法,和在 for 循環中使用 splice 時遇到過的坑,作為記錄以免我下次忘記了這個坑。

在使用 splice 之前,必備條件是,要先有一個數組。。。

var arr = new Array(1, 2, 3, 4, 5);     //初始化一個數組 [ 1, 2, 3, 4, 5 ]

看到這個數組,我覺得中間的數字3不好看,我要把它刪掉。數字3是數組下標2的元素,而且我只需要刪掉1個數字,于是。。。

var index = 2;    //數字3在數組中的下標var amount = 1;   //從數組的位置index開始刪除數字的個數var num = arr.splice( index, amount);   //從arr數組的下標2開始刪除一個數字,并將被刪除的數字賦值到num

哇,用 splice 來刪除數組元素好簡單啊,于是我開開心心地用到 for 循環里面。。。

var arr = new Array(1, 2, 3, 4, 5);     //初始化數字集合var delete_number = 3;    //要被刪除的數字//遍歷數組for(var i=0; i<arr.length; i++){    if(arr[i] === delete_number){   //如果找到要被刪除的數字所在的數組下標        var num = arr.splice( i, 1 );   //從i位置開始刪除1個數字        console.log("成功刪除 "+num);    //輸出被刪除的數字    }    else{        console.log(arr[i]+" 未被刪除");    //如果i下標的數組元素不是需要被刪除的數字,就輸出數字    }}

哈哈,討厭的數字3肯定被刪掉了。不過還是要看一下調試信息。。。

看見沒有,數字3果然被刪掉了!!!哈哈哈哈,不過仔細一看,咦,4呢???????可愛的數字4沒有被循環遍歷到。。。

前面說過,splice 是直接操作并修改數組的,所以當找到數字3時在循環中的 i 下標是2,而當刪除數字3后,數組下標 i 位置中保存的數字變為了數字4,然后到了下一個循環 i 下標為3時,數組下標 i 位置中保存的數字是5,所以跳過了數字4,于是調試信息中沒有可愛的數字4.。。。原理就是這樣子,是不是很繞。

題外話:因為我的疏忽,在一個for循環中加入了 splice 后,導致了我的H5游戲項目中的眾多 NPC 中的某一個 NPC 并沒有按預期地移動到相應的位置。最重要的是我還提交到了版本庫,與 splice 同時提交了幾百行代碼,所以不能回退版本只能斷點調試到深夜才找到這么小小錯誤。所以我寫了這篇文章來記錄一下在 for 循環中使用 splice 的坑。

說了這么多,怎么解決漏掉了數字4這個問題呢???很簡單,在使用 splice 的下一句,改一下循環變量值即可。。。

if(arr[i] === delete_number){   //如果找到要被刪除的數字所在的數組下標    var num = arr.splice( i, 1 );   //從i位置開始刪除1個數字    console.log("成功刪除 "+num);    //輸出被刪除的數字        i = i-1;    //解決方案}

看完以上內容,是不是覺得特別簡單而且小菜一碟,粗都嘛爹,等一下,我要確保你不會向我一樣犯 splice 引起的低級錯誤,所以請看以下代碼,比以上的稍微復雜一點點,如果你僅根據代碼推出的答案跟結果一樣,就能確保下次使用 splice 時會有意識避開問題了。。。

var arr = new Array(1, 2, 3, 4, 5);     //初始化數字集合var delete_number = 3;    //要被刪除的數字var amount = 2;     ////從數組的某位置開始刪除數字的個數var loop = arr.length;    //循環次數//遍歷數組for(var i=0; i < loop; i++){    if(arr[i] === delete_number){   //如果找到要被刪除的數字所在的數組下標        var num = arr.splice( i, amount );   //從i位置開始刪除1個數字                i = i - 1;    //改變循環變量        loop = loop - amount;   //改變循環次數            }    else{        console.log( arr[i] + ", ");    }}//結果:1,2,5


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 卓资县| 静安区| 陇南市| 珠海市| 泾川县| 綦江县| 岳池县| 肇庆市| 连州市| 西和县| 大同县| 鹿邑县| 黎城县| 大余县| 修文县| 闵行区| 松江区| 拜泉县| 澎湖县| 报价| 西乌| 察哈| 桐柏县| 共和县| 苏尼特左旗| 达尔| 平陆县| 云南省| 林周县| 和顺县| 那曲县| 柘荣县| 离岛区| 上林县| 余姚市| 遂宁市| 洛阳市| 招远市| 陵川县| 新邵县| 永修县|