web-dev-qa-db-fra.com

Comment parcourir une table à Lua?

Donc, j'ai un tableau quelque chose dans ce sens:

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 en fonction de leur index, et les valeurs elles-mêmes sont des tables. Je viens donc d'indexer la première valeur de la table imbriquée.

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

Ainsi, chaque fois que j'utilise l'une de ces tables, je sais ce qu'est l'index, mais je ne peux toujours pas accéder à la table à l'aide de l'index. J'ai donc commencé à écrire une fonction qui les parcourait toutes et à vérifier les index jusqu'à ce que il trouve le bon. Ensuite, j'ai réalisé ... comment puis-je les parcourir si je ne peux pas déjà les consulter par leur index? Alors maintenant je suis coincé. Je veux vraiment pouvoir taper arr.apples vs arr [1] la plupart du temps, mais bien sûr, il est nécessaire de faire les deux à la fois.

46
Lemony Lime

Pour parcourir toutes les paires clé-valeur d'une table, vous pouvez utiliser pairs:

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

les sorties:

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

Edit: Notez que Lua ne garantit aucun ordre d'itération pour la partie associative de la table. Si vous souhaitez accéder aux éléments dans un ordre spécifique, récupérez les clés de arr et triez-les. Ensuite, accédez à arr à travers les clés triées:

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

les sorties:

  apples  a   red     5
  oranges o   orange  12
  pears   p   green   7
79
greatwolf

Si vous souhaitez faire référence à une table imbriquée à l'aide de plusieurs clés, vous pouvez simplement leur affecter des clés distinctes. Les tables ne sont pas dupliquées 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 de parcourir toutes les paires clé-valeur d'une table ( http://lua-users.org/wiki/TablesTutorial ):

for k,v in pairs(t) do
 print(k,v)
end
9
frr171