lua -- 使用remove删除table数据

时间:2022-05-30 08:03:52

在Lua语言中,一切皆是table,所有数据,函数都保存在table中,但是当我们使用了table后,该如何清理table表中数据呢。
先看一个函数:
table.remove(table[,pos]):删除在pos位置上的元素,后面的元素会向前一栋,然后删除的index会向前移动,导致删除后的数据不是你想要的。当不填入pos时,删除table末尾的数据。
看如下代码:

local array = {"a","a","a","b","a","a","b"}
for i,v in ipairs(array) do
if v == "a" then
table.remove(array, i)
end
end
for i,v in ipairs(array) do
print(i,v)
end

输出结果:
lua -- 使用remove删除table数据
上面我们想要删除table表中所有“a”数据,但是输出结果并没有将所有“a”数据删除。所以我们想连续删除表中数据不能这样使用,下面是正确删除方法。

local array = {"a","a","a","b","a","a","b"}
for i=#array,1,-1 do
if array[i] == "a" then
table.remove(array, i)
end
end
for i,v in ipairs(array) do
print(i,v)
end

这样就能得到正确的删除结果了。
所以我们可以封装一个函数


-- 删除table表中符合conditionFunc的数据
-- @param tb 要删除数据的table
-- @param conditionFunc 符合要删除的数据的条件函数
local function table.removeTableData(tb, conditionFunc)
-- body
if tb ~= nil and next(tb) ~= nil then
-- todo
for i = #tb, 1, -1 do
if conditionFunc(tb[i]) then
-- todo
table.remove(tb, i)
end
end
end
end

-- 删除数据是否符合条件
-- @param data 要删除的数据
-- @return 返回是否符合删除data条件
local function removeCondition(data)
-- body
-- TODO data 符合删除的条件
return true
end

我们只需要将TODO写完,并且将table传入即可。