How to join two tables (with subtables) in Lua
我正在尝试加入Lua中的两个表。基本上,我想将一个表的内容附加到另一个表的末尾。我发现有很多代码可以做到这一点,但是当这些表具有其他表作为值时(子表,我相信它们被调用了吗?),这是行不通的。
我发现这个问题很相似:
Lua-合并表格?
除了第二个表中的内容之外,这里工作的代码正在覆盖第一个表。但是我不希望第一个表中的条目被覆盖。我只希望将第二个表中的所有内容追加到第一个表中的内容之后。但是我不知道该怎么做。
因此,当我的第一个表格看起来与此类似时:
1 2 3 4 5 6 7 8 9 10 | { Category = { Answer ="String", Answer ="String" } }, { Category = { Answer ="String", Answer ="String" } } |
我的第二点是一样的,我想得出以下结论:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | { Category = { Answer ="String", Answer ="String" } }, { Category = { Answer ="String", Answer ="String" } }, { Category = { Answer ="String", Answer ="String" } }, { Category = { Answer ="String", Answer ="String" } } |
如何做到这一点?
我使用以下代码从XML文件动态构建这些表:
https://github.com/Cluain/Lua-Simple-XML-Parser
这是我的XML文件结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?xml version="1.0" encoding="utf-8"?> <library> <gametype1> <category name=""> </answer> </answer> </answer> </category> <category name=""> </answer> </answer> </answer> </category> </gametype1> <gametype2> <category name=""> </answer> </answer> </answer> </category> <category name=""> </answer> </answer> </answer> </category> </gametype2> </library> |
然后,我像这样加载XML文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | gameAnswers1 = xml:loadFile("file1.xml", system.ResourceDirectory ) gameAnswers2 = xml:loadFile("file2.xml", system.ResourceDirectory ) gameAnswers1Gametype1 = {} gameAnswers1Gametype1 = gameAnswers1.library.gametype1 gameAnswers1Gametype2 = {} gameAnswers1Gametype2 = gameAnswers1.library.gametype2 gameAnswers2Gametype1 = {} gameAnswers2Gametype1 = gameAnswers2.library.gametype1 gameAnswers2Gametype2 = {} gameAnswers2Gametype2 = gameAnswers2.library.gametype2 |
我现在想将表连接起来,这样我只有一个表gametype1数据和一个表gametype2数据。
因此,当我通过#gameAnswers1Gametype1.category访问数据表时,我得到了正确的条目数。对于我正在测试的当前XML文件,file1.xml在gametype1节点中具有9个类别节点,而file2.xml在gametype1节点中具有1个类别节点。因此,我希望完成后,在连接表中将有10个类别节点。
(如果有关系,我将使用Corona SDK进行此操作。)
非常感激任何的帮助!
您将从XML库收到的两个文件中的每个文件的结构类似于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | { library = { gametype1 = { category = { { -- category[1] name="name1", answer = {"ans1","ans2","ans3"} }, { -- category[2] name="name2", answer = {"ans1","ans2","ans3"} }, } }, gametype2 = { category = { { -- category[1] name="name1", answer = {"ans1","ans2","ans3"} }, { -- category[2] name="name2", answer = {"ans1","ans2","ans3"} }, } }, } } |
并且您想要将table1.library.gametype1与table2.library.gametype1合并,并对table1和table2的gametype2做同样的事情。 由于在创建两个表后将不会对其进行更改,因此不需要深度复制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | local function concat(fromTable, intoTable) local lenFrom = #fromTable for i = 1, lenFrom do table.insert(intoTable, fromTable[i]) end end local gameAnswers1 = xml:loadFile("file1.xml", system.ResourceDirectory ) local gameAnswers2 = xml:loadFile("file2.xml", system.ResourceDirectory ) local gameType1A = gameAnswers1.library.gametype1 local gameType1B = gameAnswers2.library.gametype1 concat(gameType1B.category, gameType1A.category) -- now table contains its categories plus all those of table2 local tableGameType1 = gameType1A local gameType2A = gameAnswers1.library.gametype2 local gameType2B = gameAnswers2.library.gametype2 concat(gameType2B.category, gameType2A.category) -- now table1 contains its categories plus all those of table2 local tableGameType2 = gameType2A |
请注意,gameAnswers1现在包含两个文件中的所有类别。
无损连接多个表:
1 2 3 4 5 6 7 8 9 10 11 | function table.concat(...) local r, n, t = {}, 1, {...} for i = 1, select('#', ...) do local t = t[i] if t then for i = 1, #t do r[n], n = t[i], n + 1 end end end end |
该解决方案允许将表与其自身连接在一起,并忽略其他哈希键和省略的表。