Как перебирать стол в Lua?
Итак, у меня есть таблица, следующая вдоль этих строк:
arr =
{
apples = { 'a', "red", 5 },
oranges = { 'o', "orange", 12 },
pears = { 'p', "green", 7 }
}
Кажется, что нет доступа к ним на основе их индекса, а сами значения представляют собой таблицы, поэтому я просто сделал первое значение вложенной таблицы индексом, поэтому теперь он выглядит следующим образом:
arr =
{
apples = { 0, 'a', "red", 5 },
oranges = { 1, 'o', "orange", 12 },
pears = { 2, 'p', "green", 7 }
}
Итак, теперь, когда я использую одну из этих таблиц, я знаю, что такое индекс, но до сих пор не могу добраться до таблицы с помощью индекса, поэтому я начал писать функцию, которая проходит через все их, и проверять индексы пока не найдут правильный. Тогда я понял... как я могу их перебирать, если я не могу уже ссылаться на них по их индексу? Итак, теперь я застрял. Я действительно хочу, чтобы иметь возможность набирать arr.apples vs arr [1] большую часть времени, но, конечно, необходимо делать это время от времени.
Ответы
Ответ 1
Чтобы перебрать все пары ключ-значение в таблице, вы можете использовать pairs
:
for k, v in pairs(arr) do
print(k, v[1], v[2], v[3])
end
выходы:
pears 2 p green
apples 0 a red
oranges 1 o orange
Изменить. Обратите внимание: Lua не гарантирует порядок итерации для ассоциативной части таблицы. Если вы хотите получить доступ к элементам в определенном порядке, извлеките ключи из arr
и выполните сортировку. Затем выберите arr
через отсортированные ключи:
local ordered_keys = {}
for k in pairs(arr) do
table.insert(ordered_keys, k)
end
table.sort(ordered_keys)
for i = 1, #ordered_keys do
local k, v = ordered_keys[i], arr[ ordered_keys[i] ]
print(k, v[1], v[2], v[3])
end
выходы:
apples a red 5
oranges o orange 12
pears p green 7
Ответ 2
Если вы хотите сослаться на вложенную таблицу несколькими клавишами, вы можете просто назначить их отдельным ключам. Таблицы не дублируются и по-прежнему ссылаются на одни и те же значения.
arr = {}
apples = {'a', "red", 5 }
arr.apples = apples
arr[1] = apples
Этот кодовый блок позволяет вам перебирать все пары ключ-значение в таблице (http://lua-users.org/wiki/TablesTutorial):
for k,v in pairs(t) do
print(k,v)
end