如何在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 而不是 arr[1],但是当然有时必须两者都要做。

点赞
用户2074303
用户2074303

如果你想通过多个键值来引用嵌套表,你可以将它们分配给不同的键。这些表并没有被复制,仍然引用相同的值。

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-02 22:48:06
用户234175
用户234175

使用 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-02 22:49:35
用户1566608
用户1566608

所有这里的答案都建议使用 ipairs 但要注意,它并不总是起作用。

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

-- 这个 for 循环打印表格
for key,value in next,t,nil do
  print(key,value)
end

-- 这个却不会打印表格
for key,value in ipairs(t) do
  print(key,value)
end
2019-12-01 07:29:42
用户12849704
用户12849704

对于那些想知道为什么 ipairs 不总是打印表中所有值的人,下面是原因(我本可以评论这个问题,但我没有足够的好孩子点数)。

函数 ipairs 只能用于具有键值为 1 的元素的表。如果表中有一个键值为 1 的元素,则 ipairs 会尝试按顺序找到尽可能多的元素,1 -> 2 -> 3 -> 4 直到找不到下一个顺序键值的元素。元素的顺序并不重要。

不满足这些要求的表将不能使用 ipairs,应改用 pairs

例如:

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 }

打印这些表时,以下是输出。还包括 pairs 输出进行比较。

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-06 05:49:47
用户14897805
用户14897805

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

for i in pairs(actions) do
    if actions[i][3] ~= nill then
    --do something
    end
end
  1. i - 是表格中的值的索引,类似于c#
  2. actions - 表格的名称
  3. actions[i][3] 将检查表格中所有索引的第三个值是否不为nil
2021-11-19 21:29:30