Lua:以两个特定的列迭代表格(带有字母数字值)

我有这个代码,它迭代Lua表“childrenTable”以检索其值,但我希望它们按列“symbolicname”进行排序,然后再按列“name”进行排序。

  • 此示例中的表内容是手动插入的,但在我的实际情况下,它们是自动填充的,因此我无法控制它们如何进入表中。我将在此处插入内容以使表填充:

    local JSON = require 'dkjson'

    local childrenTable = {}

    childrenTable[1] = {symbolicname = "02 CONNECTOR", path = "system/core/b connector", name = "b connector"}
    childrenTable[2] = {symbolicname = "02 CONNECTOR", path = "system/core/a connector", name = "a connector"}
    childrenTable[3] = {symbolicname = "01 CORE", path = "/system/core/b", name = "b"}

    childrenTable[4] = {symbolicname = "01 CORE", path = "/system/core/a", name = "a"}

    for index,value in ipairs(childrenTable) do print(JSON.encode(value)) end

它当前返回这个结果:

{"name":"b connector","symbolicname":"02
CONNECTOR","path":"system/core/b connector"}

{"name":"a connector","symbolicname":"02
CONNECTOR","path":"system/core/a connector"}

{"name":"b","symbolicname":"01 CORE","path":"/system/core/b"}

{"name":"a","symbolicname":"01 CORE","path":"/system/core/a"}

但我想按顺序返回列表:

{"name":"a","symbolicname":"01 CORE","path":"/system/core/a"}

{"name":"b","symbolicname":"01 CORE","path":"/system/core/b"}

{"name":"a connector","symbolicname":"02
CONNECTOR","path":"system/core/a connector"}

{"name":"b connector","symbolicname":"02
CONNECTOR","path":"system/core/b connector"}

提前谢谢,

罗杰

点赞
用户13955436
用户13955436

使用table.sort函数,它将遍历整个表格并将当前索引左右的项目传递给您(table.sort基于快速排序算法)

您可以使用以下代码:

local childrenTable = {}
childrenTable[1] = {symbolicname = "02 CONNECTOR", path = "system/core/b connector", name = "b connector"}
childrenTable[2] = {symbolicname = "02 CONNECTOR", path = "system/core/a connector", name = "a connector"}
childrenTable[3] = {symbolicname = "01 CORE", path = "/system/core/b", name = "b"}
childrenTable[4] = {symbolicname = "01 CORE", path = "/system/core/a", name = "a"}

table.sort(childrenTable, function(a, b)
    if a.symbolicname < b.symbolicname then
        return true
    else
        if a.name < b.name then
            return true
        else return false end
    end
    return false
end)

for k,v in pairs(childrenTable) do print(k, v.name, v.symbolicname) end

另外,对于大量数据,请考虑使用数据框架。

2020-09-30 21:54:31