在不改变表格顺序的情况下更新 Lua 表格中的元素

我想在 Lua 中更新表格值时保持表格的顺序。

例子

tbl = {
        messageId = 0,
        timestamp = currentTime,
        responseStatus = {
            status = "FAILED",
            errorCode = "599",
            errorMessage = "problem"
        }
    }

意思是 tbl.messageId = 12345 不改变元素顺序。

点赞
用户2425163
用户2425163

就像 @moteus 所说的那样,你的前提是不正确的:Lua 表中的非数字条目不排序。这些条目的定义顺序一般不会与读取顺序相同(例如,pairs 将以任意顺序遍历这些条目)。分配一个新值不会以任何方式影响这一点。

2017-10-22 14:18:24
用户7556173
用户7556173

我认为你可以使用 table.sort,以下是一个简单的示例:

local tbl = {
    messageId = 0,
    timestamp = currentTime,
    responseStatus = {
        status = "FAILED",
        errorCode = "599",
        errorMessage = "problem"
    }
}

function fnCompare (e1, e2)
    -- 你应该保证 e1 和 e2 是 tbl 结构体
    -- 你可以先自行检查 e1 和 e2
    return e1.messageId < e2.messageId;
end

-- 测试
local tbAll = {}
tbl.messageId = 3;
table.insert(tbAll, tbl);
-- 添加一个新的
table.insert(tbAll, {messageId = 1});
table.sort(tbAll, fnCompare);
for k, v in ipairs(tbAll) do
    print(v.messageId); -- 结果:1 3
end
2017-10-22 23:51:52