要刪除key,value中table中指定的元素,
不能簡單的使用for循環來刪除
原因如下:
在table表中使用for迭代時,將符合條件的元素刪除時,後面元素前移,然後產生跳躍
而且使用for i=1,#mytable 這樣的循環時,由於在for時就已經確定了循環的終點是table的總長度,
在整個for運行過程中,終點不會改變。
所以當你刪除元素時,在循環到i = #mytable 時,會報錯nil。因爲此時table長度已經縮短了。
但是,使用while循環就在循環中刪除元素。
具體實現如下
removeElement.lua
--遍歷table的元素
function printTab(tab)
for i,v in pairs(tab) do
print(i,v)
end
end
-- 刪除table中的元素
local function removeElementByKey(tbl,key)
--新建一個臨時的table
local tmp ={}
--把每個key做一個下標,保存到臨時的table中,轉換成{1=a,2=c,3=b}
--組成一個有順序的table,才能在while循環準備時使用#table
for i in pairs(tbl) do
table.insert(tmp,i)
end
local newTbl = {}
--使用while循環剔除不需要的元素
local i = 1
while i <= #tmp do
local val = tmp [i]
if val == key then
--如果是需要剔除則remove
table.remove(tmp,i)
else
--如果不是剔除,放入新的tabl中
newTbl[val] = tbl[val]
i = i + 1
end
end
return newTbl
end
function main()
local tbl = {a=5,d=1,b=2,e=4,c=9}
print("----table元素刪除前--------")
printTab(tbl)
print("----table元素刪除後--------")
local newTbl = removeElementByKey(tbl,"b")
printTab(newTbl)
main()
執行命令 lua removeElement.lua
輸出結果 :----table元素刪除前--------
a 5
c 9
b 2
e 4
d 1
----table元素刪除後--------
a 5
d 1
c 9
e 4
刪除table中的元素成功