如何就地过滤 Lua 数组?

Vas*_*kov 5 lua

如何就地过滤 Lua 数组?

例如,有一个数组 { 1, 5, 7 }和一个函数function(elem) return elem > 1 end,就地过滤函数应将数组更改为{ 5, 7 }。还希望不要中断ipairs数组上的迭代,因此数组仍应以索引开头1

我所说的“数组”是指 Lua 表的一部分,它以 key 开头1,遍历连续的整数键,直到找到nil. 你用 迭代同样的事情ipairs

Vas*_*kov 1

下面的函数解决了这个问题:

function filter_inplace(arr, func)
    local new_index = 1
    local size_orig = #arr
    for old_index, v in ipairs(arr) do
        if func(v, old_index) then
            arr[new_index] = v
            new_index = new_index + 1
        end
    end
    for i = new_index, size_orig do arr[i] = nil end
end
Run Code Online (Sandbox Code Playgroud)