簡體   English   中英

使用拼接刪除數組中的項目

[英]Using splice to delete item in array

為什么原始數組中的剩余部分 = [1, 3, 5, 7, 9]

由於 arr.splice(i, 1) = i 是目標索引,1 是要刪除的項數,因此 i 分別從 i++ 增加到 10,即 i = i + 1 的縮寫,那么為什么要刪除 5 個索引並在數組中保留 5 ? 這就是我到目前為止所知道的,我一直在努力閱讀文檔,但仍然不知道要理解,請為我解釋一下

let arr = [1,2,3,4,5,6,7,8,9,10];

for(let i = 1; i < arr.length; i++) {
    arr.splice(i, 1);

}

這是因為每次 splice 函數運行時,arr 的長度都會減少。 這是數組的變化方式。

[2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 9, 10]
[2, 4, 6, 8, 10]

所以每個循環,i 增加,arr.length 減少 1。所以只有 5 個循環運行,結果是 [2, 4, 6, 8, 10]

您想知道為什么要刪除 1、3、5、7 和 9,對嗎?

這是為什么。 隨着 for 循環的迭代, i不斷增加 1。 但是,通過調用.splice ,您正在刪除數組的第一個元素,因此,每個其他元素都會向下移動一個索引。

讓我們在 for 循環的幾次迭代中一步一步地進行。

我 = 0; arr.splice(0, 1)移除 1,所以arr[2, 3, 4, 5, 6, 7, 8, 9, 10]

我 = 1; arr.splice(1, 1)刪除3 ,而不是 2 ,因為現在 3 位於arr索引 1 處。 執行拼接使arr[2, 4, 5, 6, 7, 8, 9, 10]

我 = 2; arr.splice(2, 1)刪除 5,因為 5 當前位於索引 2 處。因此, arr變為[2, 4, 6, 7, 8, 9, 10]

現在清楚是怎么回事了嗎?

如果您的目標是連續刪除每個元素,一次一個,那么您應該調用.splice(0, 1)而不是在循環的每次迭代中調用.splice(i, 1) .splice(0, 1) ,因為索引 0 處的值每次調用.splice時都會發生變化。

您需要檢查 for 循環結束條件,i 沒有增加到 10。為什么? 因為我 < arr.length。 所以它會像這樣:

迭代 1:

i=0; arr.length = 10; arr = [1,2,3,4,5,6,7,8,9,10]; ==> result [2,3,4,5,6,7,8,9,10]; 

迭代 2:

i=1; arr.length = 9; arr = [2,3,4,5,6,7,8,9,10];  ==> result [2,4,5,6,7,8,9,10]; 

迭代 3:

i=2; arr.length = 8; arr = [2,4,5,6,7,8,9,10];  ==> result [2,4,6,7,8,9,10]; 

. . .等等

i = 5 ==> arr.length: 5 ==> final result : [2, 4, 6, 8, 10]

因此,如果您想使用 splice 刪除所有項目:

let arr = [1,2,3,4,5,6,7,8,9,10];

while(arr.length > 0) {

    arr.splice(0, 1);

}

請記住,數組是基於 0 的。 其次,每次求值時長度都在變化。

MDN 鏈接:

拼接

地圖

所以你可能想嘗試

i =< length

其中長度已確定並提前設置並保持不變。 您可以嘗試將數組映射到一個新數組,這樣原始數組將保持純凈且不受拼接影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM