73

所以,我有一个表格,大致如下:

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] ,但当然有时两者都需要。

4

5 回答 5

121

要遍历表中的所有键值对,您可以使用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
于 2013-07-02T22:49:35.603 回答
9

如果您想通过多个键引用嵌套表,您可以将它们分配给单独的键。这些表没有重复,并且仍然引用相同的值。

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
于 2013-07-02T22:48:06.350 回答
5

对于那些想知道为什么ipairs不会一直打印表的所有值的人,这就是原因(我会对此发表评论,但我没有足够的好男孩点)。

函数ipairs仅适用于键为 1 的元素的表。如果存在键为 1 的元素,ipairs 将尝试按顺序尽可能远,1 -> 2 -> 3 -> 4 等,直到它找不到具有序列中下一个键的元素。元素的顺序无关紧要。

不满足这些要求的表将无法与ipairs 一起使用,请改用

例子:

ipairsCompatable = {"AAA", "BBB", "CCC"}
ipairsCompatable2 = {[1] = "DDD", [2] = "EEE", [3] = "FFF"}
ipairsCompatable3 = {[3] = "work", [2] = "does", [1] = "this"}

notIpairsCompatable = {[2] = "this", [3] = "does", [4] = "not"}
notIpairsCompatable2 = {[2] = "this", [5] = "doesn't", [24] = "either"}

ipairs将尽可能地进行迭代,但不会迭代表中的任何其他元素。

kindofIpairsCompatable = {[2] = 2, ["cool"] = "bro", [1] = 1, [3] = 3, [5] = 5 }

打印这些表时,这些是输出。我还包含了输出进行比较。

ipairs + ipairsCompatable
1       AAA
2       BBB
3       CCC

ipairs + ipairsCompatable2
1       DDD
2       EEE
3       FFF

ipairs + ipairsCompatable3
1       this
2       does
3       work

ipairs + notIpairsCompatable

pairs + notIpairsCompatable
2       this
3       does
4       not

ipairs + notIpairsCompatable2

pairs + notIpairsCompatable2
2       this
5       doesnt
24      either

ipairs + kindofIpairsCompatable
1       1
2       2
3       3

pairs + kindofIpairsCompatable
1       1
2       2
3       3
5       5
cool    bro
于 2020-02-06T05:49:47.080 回答
1

这里的所有答案都建议使用 ipairs 但请注意,它并非一直都有效。

t = {[2] = 44, [4]=77, [6]=88}

--This for loop prints the table
for key,value in next,t,nil do 
  print(key,value) 
end

--This one does not print the table
for key,value in ipairs(t) do 
  print(key,value) 
end
于 2019-12-01T07:29:42.580 回答
-1

大家好,我是 LUA 的新手,但这些答案只帮助了我一半。所以我自己写。

for i in pairs(actions) do 
    if actions[i][3] ~= nill then
    --do something
    end
end
  1. i - 是表中的值索引,类似于 c#
  2. 动作 - 只是表的名称
  3. actions[i][3] 如果它们的第三个值不为零,它将检查表中的所有索引
于 2021-11-19T21:29:30.377 回答