2014-01-05 98 views
4

我有一個嵌套表像這樣:Lua的嵌套表獲取元素

t1 ={} 
    t1[1] = {col1=1,col2=1,col3=1,col4=1} 
    t1[2] = {col1=1,col2=1,col3=1,col4=1} 
    t1[3] = {col1=1,col2=1,col3=1,col4=1} 
    t1[4] = {col1=1,col2=1,col3=1,col4=1} 

它實際上與T1 250項和每個嵌套表的30個項目大得多所以我想要做的就是通過循環並獲得子表中的值是這樣的:

for i = 2, 4 do 
    local width = t1[draw.ID].col1 --draw.ID is got elsewhere 
end 

但改變的.col1數部分的i一部分,所以當它遍歷它得到:

t1[draw.ID].col2 
t1[draw.ID].col3 
t1[draw.ID].col4 

我正在使用Lua 5.1。

回答

6
for i= 2, 4 do 
    local width = t1[draw.ID]["col" .. i] --draw.ID is got elsewhere 
end 
3

理想col或將包含類似陣列的表或序列。這是一種更可擴展的方式來完成你想要做的事情。字符串連接['col' .. i]以訪問它們的方式訪問表鍵,因爲數組是昂貴且不必要的,如果可以避免。這是,尤其是重要的是,如果這是你計劃經常做並且想要快速工作的東西。

-- Elements of t1 contain tables with cols. 
local t1 = {} 
t1[1] = {cols = {1,1,1,1}} 
t1[2] = {cols = {1,1,1,1}} 
t1[3] = {cols = {1,1,1,1}} 
t1[4] = {cols = {1,1,1,1}} 

for i=2, 4 do 
    local width = t1[draw.ID].cols[i] 
end 

-- Elements of t1 are the cols. 
local t1 = {} 
t1[1] = {1,1,1,1} 
t1[2] = {1,1,1,1} 
t1[3] = {1,1,1,1} 
t1[4] = {1,1,1,1} 

for i=2, 4 do 
    local width = t1[draw.ID][i] 
end 

編輯:如果這是不可避免的,你必須在['col' .. i]的風格來使用表鍵,那麼你可以做的最好的就是對其進行緩存以提高訪問速度。

-- Cache all the possible keys that you'll need. 
local colkeys = {} 
for i=1, 30 do colkeys[i] = 'col' .. i end 

for i=2, 4 do 
    local width = t1[draw.ID][colkeys[i]] 
end 

這種方法是從隨時隨地倍拼接每個你需要索引的表時間的字符串快。這不是理想的解決方案,但它的工作原理,如果你堅持像col1col30

+1

感謝Ryan,最終改變了整個代碼,所以t1的元素包含帶有列的表格。 –