¿Cómo iterar a través de una tabla en Lua?

Por lo tanto, tengo una tabla algo similar a estas líneas:

arr =
{
  apples = { 'a', "red", 5 },
  oranges = { 'o', "orange", 12 },
  pears = { 'p', "green", 7 }
}

No parece que it's posible acceder a ellos sobre la base de su índice, y los propios valores son tablas, así que acabo de hacer el primer valor de la tabla anidada el índice de la misma, por lo que ahora se ve así:

arr =
{
  apples = { 0, 'a', "red", 5 },
  oranges = { 1, 'o', "orange", 12 },
  pears = { 2, 'p', "green", 7 }
}

Por lo tanto, ahora cada vez que uso una de estas tablas, sé lo que el índice es, pero todavía no se puede llegar a la tabla utilizando el índice, así que empecé a escribir una función que bucles a través de todos ellos, y comprobar los índices hasta que encuentra la correcta. Entonces me di cuenta... ¿cómo puedo recorrerlas si no puedo referirme a ellas por su índice? Así que ahora estoy atascado. Realmente quiero ser capaz de escribir arr.manzanas vs arr[1] la mayor parte del tiempo, pero por supuesto es necesario hacer ambas cosas a veces.

Solución

Para iterar sobre todos los pares clave-valor de una tabla puede utilizar pairs:

for k, v in pairs(arr) do
  print(k, v[1], v[2], v[3])
end

salidas:

pears   2   p   green
apples  0   a   red
oranges 1   o   orange

Editar: Tenga en cuenta que Lua no garantiza ningún orden de iteración para la parte asociativa de la tabla. Si quieres acceder a los elementos en un orden específico, recupera las claves de arr y ordénalo. Luego accede a arr a través de las claves ordenadas:

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

salidas:

  apples  a   red     5
  oranges o   orange  12
  pears   p   green   7
Comentarios (9)

Si desea hacer referencia a una tabla anidada mediante varias claves, basta con asignarlas a claves distintas. Las tablas no se duplican y siguen haciendo referencia a los mismos valores.

arr = {}
apples = {'a', "red", 5 }
arr.apples = apples
arr[1] = apples

Este bloque de código permite recorrer todos los pares clave-valor de una tabla (http://lua-users.org/wiki/TablesTutorial):

for k,v in pairs(t) do
 print(k,v)
end
Comentarios (0)