在table表中使用for迭代時,將符合條件的元素刪除時,后面元素前移,然后產生跳躍
而且使用for i=1,#mytable 這樣的循環時,由於在for時就已經確定了循環的終點是table的總長度,
在整個for運行過程中,終點不會改變。
所以當你刪除元素時,在循環到i = #mytable 時,會報錯nil。因為此時table長度已經縮短了。
那么該怎么遍歷table時刪除符合條件的元素呢。
網上查了一下,使用while可以。寫了一個小測試例子:
1 local t = {} 2 t[1] = 1 3 t[2] = 2 4 t[3] = 3 5 t[4] = 4 6 t[5] = 5 7 t[6] = 6 8 local i = 1 9 while i < #t do 10 print(i) 11 print(t[i].."\n------------------") 12 if t[i] == 3 then 13 print("刪除操作、值:"..t[i]) 14 print("\n------------------") 15 table.remove(t,i) 16 else 17 i = i + 1 18 end 19 end

達到預期效果、可行。
----------------------------------------------
第二種方式是新建一個表來存儲原表中需要保留下來的元素,否則不保存
這樣也可以達到刪除原表中特定元素的效果,不過消耗了一定的內存,代碼如下:
1 local t = {} 2 local t_clone = {} 3 t[1] = 1 4 t[2] = 2 5 t[3] = 3 6 t[4] = 4 7 t[5] = 5 8 t[6] = 6 9 local i = 1 10 local j = 1 11 for i,v in pairs(t) do 12 print(i) 13 print(t[i].."\n------------------") 14 if t[i] == 3 then 15 print("刪除操作、值:"..t[i]) 16 print("\n------------------") 17 else 18 t_clone[j] =t[i] 19 j = j + 1 20 end 21 i = i + 1 22 end 23 --釋放t表 24 t = nil 25 26 for i=1,#t_clone do 27 print(i.." = "..t_clone[i]) 28 end

