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

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

该解决方案允许将表与其自身连接在一起,并忽略其他哈希键和省略的表。