­

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);

結果為空數組