Lem*_*ime 52 arrays lua loops key lua-table
所以,我有一个表格:
arr =
{
apples = { 'a', "red", 5 },
oranges = { 'o', "orange", 12 },
pears = { 'p', "green", 7 }
}
Run Code Online (Sandbox Code Playgroud)
它似乎不可能根据它们的索引访问它们,并且值本身就是表,所以我只是将嵌套表的第一个值作为它的索引,所以它现在看起来像这样:
arr =
{
apples = { 0, 'a', "red", 5 },
oranges = { 1, 'o', "orange", 12 },
pears = { 2, 'p', "green", 7 }
}
Run Code Online (Sandbox Code Playgroud)
所以,现在任何时候我使用其中一个表,我知道索引是什么,但仍然无法使用索引到达表,所以我开始编写一个循环遍历它们的函数,并检查索引直到它找到了合适的人选.然后我意识到......如果我不能通过索引引用它们,我怎么能遍历它们?所以,现在我被卡住了.我真的希望能够在大多数时间输入arr.apples和arr [1],但当然有时需要同时输入两个.
gre*_*olf 91
要迭代表中的所有键值对,您可以使用pairs:
for k, v in pairs(arr) do
print(k, v[1], v[2], v[3])
end
Run Code Online (Sandbox Code Playgroud)
输出:
pears 2 p green
apples 0 a red
oranges 1 o orange
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,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
Run Code Online (Sandbox Code Playgroud)
输出:
apples a red 5
oranges o orange 12
pears p green 7
Run Code Online (Sandbox Code Playgroud)
如果要通过多个键引用嵌套表,只需将它们分配给单独的键即可.表格不重复,仍然引用相同的值.
arr = {}
apples = {'a', "red", 5 }
arr.apples = apples
arr[1] = apples
Run Code Online (Sandbox Code Playgroud)
此代码块允许您遍历表中的所有键值对(http://lua-users.org/wiki/TablesTutorial):
for k,v in pairs(t) do
print(k,v)
end
Run Code Online (Sandbox Code Playgroud)
对于那些想知道为什么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"}
Run Code Online (Sandbox Code Playgroud)
ipairs将尽可能地进行迭代,但不会迭代表中的任何其他元素。
kindofIpairsCompatable = {[2] = 2, ["cool"] = "bro", [1] = 1, [3] = 3, [5] = 5 }
Run Code Online (Sandbox Code Playgroud)
打印这些表时,这些是输出。我还包含了成对输出以进行比较。
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
Run Code Online (Sandbox Code Playgroud)