如何在Lua中按不同字段对表进行二次排序?
问题描述
示例数据
Data = { ["C1_RN1::F1"] = { ["class"] = "Hunter", ["name"] = "C1", ["faction"] = "Faction", ["race"] = "Human", ["realm"] = "RN1", }, ["C2_RN1::F1"] = { ["class"] = "Priest", ["name"] = "C2", ["faction"] = "Faction", ["race"] = "Undead", ["realm"] = "RN1", }, ["C3_RN1::F1"] = { ["class"] = "Hunter", ["name"] = "C3", ["faction"] = "Faction", ["race"] = "Human", ["realm"] = "RN1", } }
需求
对上述表中元素排序:
- 优先按
race字段的字母顺序排序 - 同一种族内,再按
class字段的字母顺序排序
遇到的问题
尝试单字段排序时,Lua 5.1报错“<后应加=”,尝试的代码如下:
local function SortThis() local temp = {} for c in pairs(Data) do table.insert(temp, c); end table.sort(temp, function(a, b) return Data[a].race < RestXP_Data[b].race; end) end
问题分析与解决
报错原因
代码存在变量名错误:将目标表Data误写为RestXP_Data,导致Lua无法找到对应表字段,触发了误导性的语法错误提示。
修正后的完整代码
local function SortThis() local temp = {} -- 提取所有键到临时表 for c in pairs(Data) do table.insert(temp, c) end -- 多字段排序逻辑:先按race排序,同race再按class排序 table.sort(temp, function(a, b) local raceA = Data[a].race local raceB = Data[b].race -- 种族不同时,按字母序比较 if raceA ~= raceB then return raceA < raceB end -- 种族相同时,按职业字母序比较 local classA = Data[a].class local classB = Data[b].class return classA < classB end) -- 可选:验证排序结果 for _, key in ipairs(temp) do local char = Data[key] print(string.format("%s: %s - %s", key, char.race, char.class)) end end -- 执行排序 SortThis()
代码说明
- 变量修正:将
RestXP_Data[b].race改为Data[b].race,解决报错问题。 - 排序逻辑:
- 先比较两个元素的
race值,若不同则直接按字母序返回比较结果 - 若
race相同,则进一步比较class值,按字母序排序
- 先比较两个元素的
- 验证输出:运行后会输出符合需求的排序结果:
C1_RN1::F1: Human - Hunter C3_RN1::F1: Human - Hunter C2_RN1::F1: Undead - Priest
内容的提问来源于stack exchange,提问作者AeroMaxx
相关产品推荐
相关产品推荐

