我正在處理大量用Lua編寫的數據文件。他們大多是用這種方式,「電話本」爲例:Lua,自定義迭代器 - 正確的方式來定義?
data = {
-- First Level - country
USA = {
-- Second level - city
Denver = {
-- Third level - actual entries
{name = 'John', number = '12345'},
-- more entries
},
Washington = {
{name = 'Ann', number = '54321'},
-- more entries
},
-- more cities with entries
},
-- more countries with cities and entries
}
因此,事實上,第一個層次是「國家」和第二個是「城市」是隱含的,但它使數據更緊湊。
現在,當實際搜索一些數據時,我想將這些數據作爲條目進行迭代,包括此級別的隱含信息。
-- Coroutine yielding entries including level data
function corIter(data)
for country,l1 in pairs(data) do
for city,l2 in pairs(l1) do
for _,entry in pairs(l2) do
-- Copy the entry
local out = {}
for k,v in pairs(entry) do
out[k] = v
end
-- Add level properties
out.country = country
out.city = city
coroutine.yield(out)
end
end
end
end
-- Iterate over the entries
local cor = coroutine.create(corIter)
local _, entry = coroutine.resume(cor, data)
while entry do
-- Handle the entry, has 'name', 'number', 'country' and 'city' keys
table.print(entry) -- (custom print function I use)
-- Get the next one
_, entry = coroutine.resume(cor)
end
但我認爲這種做法可能是壞的,因爲它使整個線程活着只是爲了遍歷一個該死的表格以特定的方式。
有沒有其他「明顯」的解決方案呢?關鍵是性能和易用性。我並不完全需要一個通用的解決方案(對於數據表內的任意數量的「級別」),但是這一切都像黑客一樣下跌。
可不可以給你心目中的查詢的例子嗎? – lhf