在前端使用 `table.remove` 删除表中的元素很简单,这是Lua的标准函数。
**基本用法:**
```lua
local myTable = {10, 20, 30, 40, 50}
-- 删除指定位置的元素(位置从1开始)
table.remove(myTable, 3) -- 删除第3个元素(30)
-- 删除后数组会自动调整,后面的元素前移
SL:Print("删除后数组:")
for i, v in ipairs(myTable) do
SL:Print(i, v) -- 输出:1 10, 2 20, 3 40, 4 50
end
```
**删除最后一个元素:**
```lua
local items = {"苹果", "香蕉", "橙子"}
table.remove(items) -- 不指定位置时,默认删除最后一个元素
-- 现在items = {"苹果", "香蕉"}
```
**删除第一个元素:**
```lua
local players = {"玩家A", "玩家B", "玩家C"}
table.remove(players, 1) -- 删除第一个元素
-- 现在players = {"玩家B", "玩家C"}
```
**结合循环删除多个元素:**
```lua
local numbers = {1, 2, 3, 4, 5, 6, 7, 8}
-- 倒序删除避免索引错乱
for i = #numbers, 1, -1 do
if numbers[i] % 2 == 0 then -- 删除偶数
table.remove(numbers, i)
end
end
SL:Print("删除偶数后:", table.concat(numbers, ", ")) -- 输出:1, 3, 5, 7
```
**实际应用示例(删除邮件):**
```lua
local mailList = SL:GetMetaValue("MAIL_LIST") or {}
local mailIdToRemove = 1001 -- 要删除的邮件ID
-- 查找要删除的邮件索引
local removeIndex = nil
for i, mail in ipairs(mailList) do
if mail.Id == mailIdToRemove then
removeIndex = i
break
end
end
-- 删除找到的邮件
if removeIndex then
table.remove(mailList, removeIndex)
SL:Print("成功删除邮件ID:", mailIdToRemove)
end
```
**注意事项:**
1. `table.remove` 会改变原表,后面的元素会自动前移
2. 删除后数组长度会减1
3. 在循环中删除元素时,建议从后往前遍历,避免索引错乱
4. 删除不存在的索引会返回nil,不会报错
**常见错误:**
```lua
local t = {1, 2, 3, 4, 5}
-- 错误:正序删除会导致跳过元素
for i = 1, #t do
if t[i] % 2 == 0 then
table.remove(t, i) -- 删除后i指向的元素变了
end
end
-- 正确:倒序删除
for i = #t, 1, -1 do
if t[i] % 2 == 0 then
table.remove(t, i)
end
end
```
这个函数在游戏开发中经常用到,比如删除背包物品、清理过期数据等。