Search for an item in a Lua list

后端 未结 10 2431
青春惊慌失措
青春惊慌失措 2020-11-29 00:56

If I have a list of items like this:

local items = { \"apple\", \"orange\", \"pear\", \"banana\" }

how do I check if \"orange\" is in this

10条回答
  •  猫巷女王i
    2020-11-29 01:21

    This is a swiss-armyknife function you can use:

    function table.find(t, val, recursive, metatables, keys, returnBool)
        if (type(t) ~= "table") then
            return nil
        end
    
        local checked = {}
        local _findInTable
        local _checkValue
        _checkValue = function(v)
            if (not checked[v]) then
                if (v == val) then
                    return v
                end
                if (recursive and type(v) == "table") then
                    local r = _findInTable(v)
                    if (r ~= nil) then
                        return r
                    end
                end
                if (metatables) then
                    local r = _checkValue(getmetatable(v))
                    if (r ~= nil) then
                        return r
                    end
                end
                checked[v] = true
            end
            return nil
        end
        _findInTable = function(t)
            for k,v in pairs(t) do
                local r = _checkValue(t, v)
                if (r ~= nil) then
                    return r
                end
                if (keys) then
                    r = _checkValue(t, k)
                    if (r ~= nil) then
                        return r
                    end
                end
            end
            return nil
        end
    
        local r = _findInTable(t)
        if (returnBool) then
            return r ~= nil
        end
        return r
    end
    

    You can use it to check if a value exists:

    local myFruit = "apple"
    if (table.find({"apple", "pear", "berry"}, myFruit)) then
        print(table.find({"apple", "pear", "berry"}, myFruit)) -- 1
    

    You can use it to find the key:

    local fruits = {
        apple = {color="red"},
        pear = {color="green"},
    }
    local myFruit = fruits.apple
    local fruitName = table.find(fruits, myFruit)
    print(fruitName) -- "apple"
    

    I hope the recursive parameter speaks for itself.

    The metatables parameter allows you to search metatables as well.

    The keys parameter makes the function look for keys in the list. Of course that would be useless in Lua (you can just do fruits[key]) but together with recursive and metatables, it becomes handy.

    The returnBool parameter is a safe-guard for when you have tables that have false as a key in a table (Yes that's possible: fruits = {false="apple"})

提交回复
热议问题