要删除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中的元素成功