jq使用splice刪除數組元素出錯的解決方法
- 2019 年 12 月 18 日
- 筆記
jq的splice用於刪除數組裡某些元素,並且會改變原數組
定義和用法
splice() 方法向/從數組中添加/刪除項目,然後返回被刪除的項目。
注釋:該方法會改變原始數組。
語法
arrayObject.splice(index,howmany,item1,.....,itemX)
參數 |
描述 |
---|---|
index |
必需。整數,規定添加/刪除項目的位置,使用負數可從數組結尾處規定位置。 |
howmany |
必需。要刪除的項目數量。如果設置為 0,則不會刪除項目。 |
item1, …, itemX |
可選。向數組添加的新項目。 |
返回值
類型 |
描述 |
---|---|
Array |
包含被刪除項目的新數組,如果有的話。 |
說明
splice() 方法可刪除從 index 處開始的零個或多個元素,並且用參數列表中聲明的一個或多個值來替換那些被刪除的元素。
如果從 arrayObject 中刪除了元素,則返回的是含有被刪除的元素的數組。
瀏覽器支持
所有主流瀏覽器都支持 splice() 方法。
提示和注釋
注釋:請注意,splice() 方法與 slice() 方法的作用是不同的,splice() 方法會直接對數組進行修改。
下面是一個實例
var arr = [1,2,3,4,5,6,7,8,9];
for(i=0;i<arr.length;i++){
arr.splice(2,1);
}
console.log(arr);
輸出結果:[1, 2, 8, 9];
是不是和預想的結果不一樣?
難道不是就刪除arr[2]的屬性么,為什麼會刪除這麼多?
原因在於,當刪除arr[2],頁就是刪除3的時候,arr數組將會重新進行計算索引,則那時候的值是
arr=[1,2,4,5,6,7,8,9];i的值為1;那時候的length值為8
第二次循環依然可以刪除4;i的值為2;那時候的length值為8
arr=[1,2,5,6,7,8,9];
以此類推,到[1,2,7,8,9]時,i為5,那時候的length值為5;
所以最後一次刪除arr[2]時,循環結束
剩餘
[1,2,8,9];
所以,當你真正想循環刪除數組元素時,在刪除之後要i–才能保證循環指針正確指向下一個需要處理的元素上
例如 當你想
var arr = [1,2,3,4,5,6,7,8,9];
for(i=0;i<arr.length;i++){
arr.splice(i,1);
}
console.log(arr);
結果為[2,4,6,8];
var arr = [1,2,3,4,5,6,7,8,9];
for(i=0;i<arr.length;i++){
arr.splice(i,1);
i–;
}
console.log(arr);
結果為空數組