Comment itérer à travers la table dans Lua?

donc, j'ai une table quelque chose comme ça:

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

il ne semble pas qu'il soit possible d'y accéder à partir de leur index, et les valeurs elles-mêmes sont des tables, donc j'ai juste fait la première valeur de la table imbriquée l'index de celui-ci, il ressemble maintenant à ceci:

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

donc, maintenant chaque fois que j'utilise une de ces tables, je sais ce qu'est l'index, mais je ne peux toujours pas accéder à la table en utilisant l'index, donc j'ai commencé à écrire une fonction qui fait des boucles à travers toutes les tables., et vérifiez les index jusqu'à ce qu'il trouve le bon. Puis j'ai réalisé... Comment puis-je les passer en boucle si Je ne peux pas déjà les référencer par leur index? Alors, maintenant, je suis coincé. Je veux vraiment pouvoir taper arr.pommes vs arr[1] la plupart du temps, mais bien sûr, il est nécessaire de faire les deux à la fois.

34
demandé sur greatwolf 2013-07-03 02:37:01

2 réponses

pour itérer toutes les paires de valeurs-clés d'une table, vous pouvez utiliser pairs:

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

sorties:

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

Modifier: notez que Lua ne garantit aucun ordre d'itération pour la partie associative de la table. Si vous voulez accéder aux éléments dans un ordre spécifique, récupérez les clés de arr et de tri. Ensuite, accédez à arr par le biais de la triés clés:

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

sorties:

  apples  a   red     5
  oranges o   orange  12
  pears   p   green   7
59
répondu greatwolf 2013-07-03 00:44:56

si vous voulez renvoyer à une table emboîtée par plusieurs touches, vous pouvez simplement les assigner à des touches séparées. Les tableaux ne sont pas dupliqués et font toujours référence aux mêmes valeurs.

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

ce bloc de code vous permet d'itérer toutes les paires de valeurs clés dans une table (http://lua-users.org/wiki/TablesTutorial):

for k,v in pairs(t) do
 print(k,v)
end
9
répondu frr171 2013-07-02 22:48:06