Questa è una funzione swiss-armyknife è possibile utilizzare:
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
si può utilizzare per verificare se esiste un valore:
local myFruit = "apple"
if (table.find({"apple", "pear", "berry"}, myFruit)) then
print(table.find({"apple", "pear", "berry"}, myFruit)) -- 1
Potete usarlo per trovare la chiave:
local fruits = {
apple = {color="red"},
pear = {color="green"},
}
local myFruit = fruits.apple
local fruitName = table.find(fruits, myFruit)
print(fruitName) -- "apple"
Spero che il parametro recursive
parli da solo.
Il parametro metatables
consente di cercare anche i metatables.
Il parametro keys
fa in modo che la funzione cerchi le chiavi nell'elenco. Ovviamente questo sarebbe inutile a Lua (si può semplicemente fare fruits[key]
) ma insieme a recursive
e metatables
, diventa utile.
Il parametro returnBool
è una salvaguardia per quando si dispone di tabelle che hanno false
come una chiave in una tabella (sì che sia possibile: fruits = {false="apple"}
)
Questo è il modo migliore per fare una serie (in matematica pura senso) delle cose a Lua. Bravo! Tuttavia, dal momento che non ha alcun concetto di ordine, non risponde necessariamente alla domanda generale di "Cerca un elemento in un elenco Lua?" se l'ordine della lista è importante. – Mark
Questo sembra molto più elegante. L'ho appena usato per creare un tavolo simile a '{thingIAmLookingFor: true, secondThingIAmLookingFor: true}' –
Sembra non funzionare con i numeri. – CalculatorFeline