阅读完这个答案后,我明白了优点,但对这个函数有些困惑

我想使用lua从表格中删除一个项目。

快速搜索得出table.remove()由于效率低而不好。

但是我并没有完全理解自定义函数

下面是这个函数

function ArrayRemove(t, fnKeep)
local j, n = 1, #t;

for i=1,n do
    if (fnKeep(t, i, j)) then
        -- 将i的值保留在j的位置上,如果它不在那儿。
        if (i ~= j) then
            t[j] = t[i];
            t[i] = nil;
        end
        j = j + 1; -- 递增下一个未删除元素的新位置。
    else
        t[i] = nil;
    end
end

return t;
end

我理解,我们在一个循环中移动项目和删除所有项目,而不是要table.remove()移动所有东西(这里有一个长答案,关于Safely remove items from an array table while iterating

看看上面的函数,如果要删除的项目是第一个项目会发生什么?

如果我们将行if (fnKeep(t, i, j)) then替换为 (t[i] == 'deleteme'),如建议一样

那么什么也不会发生,因为i和j都是1

另外,如果第一个“if”为false,那么该项将被删除?

请有经验的人给我一些提示

编辑

我认为工作函数如下

local j, n = 1, #t -- 要迭代的表

for i = 1, n do -- 开始循环

    if t[i] ~= 'object to delete' then -- 如果这不是要删除的项

        if i ~= j then -- 可以移动到新位置吗

            t[j] = t[i] -- 移动到新位置
            t[i] = nil -- 清除旧位置

        end

        j = j + 1 -- 递增新位置

        end

    else -- 如果是要删除的项目,则将其删除

    t[i] = nil

end
点赞