这是一个你可以使用的瑞士军刀函数:
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
你可以使用它来检查值是否存在:
local myFruit = "apple"
if (table.find({"apple", "pear", "berry"}, myFruit)) then
print(table.find({"apple", "pear", "berry"}, myFruit)) -- 1
你可以使用它来查找密钥:
local fruits = {
apple = {color="red"},
pear = {color="green"},
}
local myFruit = fruits.apple
local fruitName = table.find(fruits, myFruit)
print(fruitName)
我希望“recursive”参数可以自解释。
“metatables”参数允许您搜索元表。
“keys”参数使函数在列表中查找键。当然,在Lua中这是无用的(您只需执行“fruits[key]”),但与“recursive”和“metatables”一起使用时,它变得方便。
“returnBool”参数是一个安全保护措施,用于处理具有“false”作为键的表(是的,这是可能的:“fruits = {false =“apple”}”)。
{thingIAmLookingFor:true, secondThingIAmLookingFor:true}
的表格。 - stiller_leserif "orange" in items
并不需要构建您自己的专门列表。有没有一种Lua方法可以接受任何字符串列表并以这种方式重建它? - Zimlocal items = { [42]=true, ['foo bar']=true, ['éà']=true }
。实际上,没有括号的表示法是一种语法糖(在Lua中经常出现)。您可能会对Tables Tutorial感兴趣。 - Gras Double