我想在Lua中加入两个表。基本上,我想将一个表的内容追加到另一个表的末尾。我已经找到了很多代码来执行此操作,但是当表中有其他表作为值(子表,我相信它们被称为?)时,它不起作用。
我发现这个问题类似: Lua - merge tables?
那里的代码工作,除了第二个表中的内容是覆盖第一个表。但我不希望覆盖第一个表中的条目。我只想将第二个表中的所有内容添加到第一个表中的内容之后。但我无法弄清楚如何做到这一点。
所以当我的第一张表看起来与此相似时:
{ Category =
{ Answer = "String",
Answer = "String"
}
},
{ Category =
{ Answer = "String",
Answer = "String"
}
}
我的第二个是相同的,我想最终得到:
{ 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文件结构:
<?xml version="1.0" encoding="utf-8"?>
<library>
<gametype1>
<category name="">
<answer></answer>
<answer></answer>
<answer></answer>
</category>
<category name="">
<answer></answer>
<answer></answer>
<answer></answer>
</category>
</gametype1>
<gametype2>
<category name="">
<answer></answer>
<answer></answer>
<answer></answer>
</category>
<category name="">
<answer></answer>
<answer></answer>
<answer></answer>
</category>
</gametype2>
</library>
然后我加载这样的XML文件:
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进行此操作。)
非常感谢任何帮助!
答案 0 :(得分:1)
您将从XML lib中为每个文件收到的结构类似于
{
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执行相同的操作。由于您在创建后不会更改这两个表,因此您不需要深层复制:
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 :(得分:0)
非破坏性地连接多个表:
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
此解决方案允许将表与自身连接,并忽略其他散列键和省略的表。