首先,DeadMG 是正确的;您使用了字符串而不是数字索引。但是,即使您确实使用了数字索引,也无济于事。
如果你这样做:
someTable = {"value1", "value2", {"value3a", "value3b"}};
someTable[50] = {"value50a", "value50b"};
表的长度 ,#someTable
仍然是3。为什么?因为 Lua 根据连续元素在表中定义数组。请记住:您可以访问任何表格的任何元素;它们在概念上都被填充,nil
直到你给它们一个实际值。
Lua 将表的长度定义为表中值的数量,如果你从数字索引 1 开始计数直到你到达第一个nil
值。因为someTable[4]
是 nil,所以长度是 3。
如果你想在数组表的末尾插入一个新元素,那么你可以这样做:
someTable[#someTable + 1] = "newValue";
该值本身可以是一个表:
someTable[#someTable + 1] = {"newValuea", "newValueb"};
如果您只是询问如何访问嵌套表,那很简单,与您使用的键无关。
嵌套表没有什么特别之处。表是值,表条目可以是任何值,包括其他表。
如果你有一张桌子,并且想要遍历其中的数组条目,你可以使用这个:
local aTable = {"first", "second", "third", ...}
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
嵌套表也不例外。这只是获得桌子的问题。
local nestedTable = { "first", "second", "third", ...}
nestedTable[#nestedTable + 1] = {"newFirst", "newSecond", ...}
local aTable = nestedTable[#nestedTable];
for i, value in ipairs(aTable) do
--`value` contains the entries in the table.
end
或者你可以这样做ipairs(nestedTable[#nestedTable])
。请注意,此处使用的特定键(整数值)完全不重要。该键可能是一个字符串、一个浮点数、另一个表、一些用户数据等。没关系。
另请注意,我们使用它ipairs
是因为我们只想遍历表的数组成员。数组的长度在上面定义。如果我们想遍历表的每个成员,我们将使用pairs
而不是ipairs
. 当然,pairs
会进行无序搜索,因此不能保证按数组顺序。
如果要递归查找嵌套表中的每个元素,可以这样做:
local function RecursiveSearch(aTable)
for key, value in pairs(aTable) do --unordered search
if(type(value) == "table") then
RecursiveSearch(value)
else
--Do something with this.
end
end
end
请注意,上面可以执行无限循环,因为表可能具有循环引用:
local tableA = {}
local tableB = {tableA}
local tableA[1] = tableB
RecursiveSearch(tableA) --Infinite loop.