Search for an item in a Lua list

后端 未结 10 2364
青春惊慌失措
青春惊慌失措 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条回答
  • 2020-11-29 01:09
    function table.find(t,value)
        if t and type(t)=="table" and value then
            for _, v in ipairs (t) do
                if v == value then
                    return true;
                end
            end
            return false;
        end
        return false;
    end
    
    0 讨论(0)
  • 2020-11-29 01:18
    function valid(data, array)
     local valid = {}
     for i = 1, #array do
      valid[array[i]] = true
     end
     if valid[data] then
      return false
     else
      return true
     end
    end
    

    Here's the function I use for checking if data is in an array.

    0 讨论(0)
  • 2020-11-29 01:20

    Use the following representation instead:

    local items = { apple=true, orange=true, pear=true, banana=true }
    if items.apple then
        ...
    end
    
    0 讨论(0)
  • 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"})

    0 讨论(0)
  • 2020-11-29 01:22

    Lua tables are more closely analogs of Python dictionaries rather than lists. The table you have create is essentially a 1-based indexed array of strings. Use any standard search algorithm to find out if a value is in the array. Another approach would be to store the values as table keys instead as shown in the set implementation of Jon Ericson's post.

    0 讨论(0)
  • 2020-11-29 01:23

    you can use this solution:

    items = { 'a', 'b' }
    for k,v in pairs(items) do 
     if v == 'a' then 
      --do something
     else 
      --do something
     end
    end
    
    

    or

    items = {'a', 'b'}
    for k,v in pairs(items) do 
      while v do
        if v == 'a' then 
          return found
        else 
          break
        end
      end 
     end 
    return nothing
    
    0 讨论(0)
提交回复
热议问题