Lua中针对多维表的表过滤器

我正在设计一个通用的表过滤器,可以从给定的表中删除条目,问题在于键不是唯一的,类型也是不同的。

让我用一个例子更清楚地解释一下

SampleTable = {
    { key1 = 10, key2 = 'name_1', Str = 'sample_string_1'     },
    { key1 = 10, key2 = 'name_3', Str = 'sample_string_2'     },
    { key1 = 11, key2 = 'name_2', Mac = {'ID1', 'ID2', 'ID3'} },
    { key1 = 11, key2 = 'name_2', Mac = {'ID1'}               },
    { key1 = 12, key2 = 'name_4', Mac = {'ID2', 'ID3'}        }
}

function filter(inputTable, ...)
    filterItems = {...}
end

我想传递任意数量的键以过滤此表

local key1 = 11
local Mac = 'ID1'
filter(SampleTable, key1, Mac)
 -- 应该返回 -> { key1 = 11, key2 = 'name_2', Mac = 'ID1'},

key1 = 12
Mac = 'ID3'
filter(SampleTable, key1, Mac)
-- 应该返回 -> { key1 = 12, key2 = 'name_4', Mac = ID3'}

key1 = 11
Mac = 'ID2'
filter(SampleTable, key1, Mac)
 -- 应该同时返回
-- { key1 = 11, key2 = 'name_2', Mac = ID2'},
-- { key1 = 11, key2 = 'name_5', Mac = ID2'},

key1 = 10
Str = 'sample_string_2'
filter(SampleTable, key1, Str)
 -- 应该返回 { key1 = 10, key2 = 'name_3', Str = 'sample_string_2'}

我目前的解决方案是在两个表中搜索每个键值对

function filter(tIn, tFilter)
    local retain = true
    local exist  = nil
    local tOut = tIn
    local _findInTable = function (t, k, v)
        if(not t[k]) then return true
        elseif(t[k] and t[k] == v) then return true
        else return false end
    end

    for i, t in ipairs (tIn) do
        for k,v in pairs (tFilter) do
            exist = _findInTable(t, k, v)
            retain = retain and exist
        end
        if not retain then tOut[i] = nil end
        retain = true
    end
    return tOut
end

local myTable = filter(SampleTable, {key1 = 11, Mac = 'ID1'})

问题是我不能预见递归如何帮助。 当我有以下SampleTable时,这段代码适用,如你所见,“Mac”不是我的代码中的子表。

SampleTable = {
    { key1 = 10, key2 = 'name_1', Str = 'sample_string_1'     },
    { key1 = 10, key2 = 'name_3', Str = 'sample_string_2'     },
    { key1 = 11, key2 = 'name_2', Mac = 'ID1'                 }
    -- { key1 = 11, key2 = 'name_2', Mac = {'ID1', 'ID2', 'ID3'} },
    -- { key1 = 11, key2 = 'name_2', Mac = {'ID1'}               },
    -- { key1 = 12, key2 = 'name_4', Mac = {'ID2', 'ID3'}        }
}
点赞