Đây là một chức năng swiss-armyknife bạn có thể sử dụng:
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
Bạn có thể sử dụng nó để kiểm tra xem một giá trị tồn tại:
local myFruit = "apple"
if (table.find({"apple", "pear", "berry"}, myFruit)) then
print(table.find({"apple", "pear", "berry"}, myFruit)) -- 1
Bạn có thể sử dụng nó để tìm chìa khóa:
local fruits = {
apple = {color="red"},
pear = {color="green"},
}
local myFruit = fruits.apple
local fruitName = table.find(fruits, myFruit)
print(fruitName) -- "apple"
Tôi hy vọng thông số recursive
sẽ tự nói lên.
Thông số metatables
cũng cho phép bạn tìm kiếm các thẻ meta.
Tham số keys
làm cho hàm tìm kiếm các khóa trong danh sách. Tất nhiên đó sẽ là vô ích trong Lua (bạn chỉ có thể làm fruits[key]
) nhưng cùng với recursive
và metatables
, nó trở nên tiện dụng.
Tham số returnBool
là một an toàn-vệ cho khi bạn có các bảng có false
như một chìa khóa trong một bảng (Có đó là có thể: fruits = {false="apple"}
)
Đây là cách tốt nhất để thực hiện một bộ (trong toán học thuần túy ý nghĩa) của sự vật ở Lua. Bravo! Tuy nhiên, vì nó không có khái niệm về trật tự, nó không nhất thiết phải trả lời câu hỏi chung về "Tìm kiếm một mục trong danh sách Lua?" nếu thứ tự danh sách quan trọng. – Mark
Điều này cảm thấy thanh lịch hơn rất nhiều. Chỉ cần sử dụng nó để tạo một bảng trông giống như '{thingIAmLookingFor: true, secondThingIAmLookingFor: true}' –
Dường như không hoạt động với các con số. – CalculatorFeline