2014-01-05 4 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} 

это на самом деле гораздо больше 250 элементов в t1 и 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 

Edit: Если это неизбежно, что вы должны использовать ключи таблиц в стиле ['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 

Этот метод в любом месте от к раз быстрее, чем конкатенация строку каждый раз, что вам нужно индексировать таблицу. Это не решение , но оно работает, если вы застряли с подобными col1 до col30.

+1

Спасибо, Райан, в конечном итоге изменил весь код, поэтому элементы t1 содержат таблицы с cols. –

Смежные вопросы