如何在Lua中连接两个表(带子表)

时间:2014-03-16 09:53:46

标签: join lua lua-table

我想在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进行此操作。)

非常感谢任何帮助!

2 个答案:

答案 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

此解决方案允许将表与自身连接,并忽略其他散列键和省略的表。