Dies ist eine Schweizer-armyknife Funktion können Sie:
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
Sie es verwenden können, wenn ein Wert vorhanden ist zu überprüfen:
local myFruit = "apple"
if (table.find({"apple", "pear", "berry"}, myFruit)) then
print(table.find({"apple", "pear", "berry"}, myFruit)) -- 1
Sie es den Schlüssel finden verwenden können:
Ich hoffe, der recursive
Parameter spricht für sich.
Der Parameter metatables
ermöglicht es Ihnen auch Metatabellen zu suchen.
Der Parameter keys
lässt die Funktion nach Schlüsseln in der Liste suchen. Natürlich wäre das in Lua nutzlos (Sie können einfach fruits[key]
tun), aber zusammen mit recursive
und metatables
wird es praktisch.
Der returnBool
Parameter ist ein Schutz für die, wenn Sie Tabellen, die false
als Schlüssel in einer Tabelle (Ja, das ist möglich: fruits = {false="apple"}
) haben
Dies ist der beste Weg, um einen Satz zu machen (in den reinen mathematischen Sinn) der Dinge in Lua. Bravo! Da es jedoch kein Ordnungskonzept hat, beantwortet es nicht unbedingt die allgemeine Frage "Suche nach einem Objekt in einer Lua-Liste?" wenn die Reihenfolge der Listen zählt. – Mark
Das fühlt sich so viel eleganter an. Habe es einfach benutzt, um eine Tabelle zu erstellen, die aussah wie '{thingIAmLookingFor: true, secondThingIAmLookingFor: true}' –
Scheint nicht mit Zahlen zu arbeiten. – CalculatorFeline