如何使用Lua将复杂表转换为全小写形式?
如何使用Lua将表的键和值转换为全小写形式?
嘿,这个问题很容易解决!咱们结合Lua的内置字符串工具和表遍历就能搞定你的需求。先看看你的示例表(我稍微调整了格式让它更易读):
local originalTable = { { ["House"] = "bob", ["Roof"] = "steve", ["Door-Knob"] = "Richard", ["Rug-Duty"] = "mark", } }
你的目标是把所有键(比如House、Door-Knob)和值(比如Richard)都转换成全小写,对吧?下面给你两种实用方案:
方案1:针对固定单层嵌套表
如果你的表结构就是外层数组+内层键值表,那可以写一个简单的遍历函数:
function convertToLower(inputTable) local result = {} -- 遍历外层数组的元素(你的表只有一个子表) for _, subTable in ipairs(inputTable) do local lowerSubTable = {} -- 遍历子表的每个键值对 for key, value in pairs(subTable) do -- 把键和值都转成小写 local lowerKey = string.lower(key) local lowerValue = string.lower(value) lowerSubTable[lowerKey] = lowerValue end table.insert(result, lowerSubTable) end return result end
调用函数并验证结果:
local lowerCaseTable = convertToLower(originalTable) -- 打印转换后的内容 for _, subTable in ipairs(lowerCaseTable) do for k, v in pairs(subTable) do print(k, v) end end
输出会是:
house bob roof steve door-knob richard rug-duty mark
方案2:通用递归版本(支持任意深度嵌套)
如果你的表可能有更深的嵌套(比如子表里面还有子表),那可以用递归函数处理所有层级的字符串:
function recursiveConvertToLower(input) -- 如果是表,递归处理每个键值 if type(input) == "table" then local result = {} for k, v in pairs(input) do -- 只有字符串类型的键才转小写,数字/布尔键保持原样 local lowerKey = type(k) == "string" and string.lower(k) or k -- 递归处理值 local lowerValue = recursiveConvertToLower(v) result[lowerKey] = lowerValue end return result -- 如果是字符串,直接转小写 elseif type(input) == "string" then return string.lower(input) -- 其他类型(数字、布尔等)直接返回原内容 else return input end end
这个版本能处理更复杂的结构,比如:
local nestedTable = { { ["House"] = {["Owner"] = "Richard", ["Size"] = "LARGE"}, ["Roof"] = "steve" } } local lowerNested = recursiveConvertToLower(nestedTable)
转换后内层的Owner会变成owner,LARGE变成large。
关键说明
string.lower()是Lua内置函数,专门用来把字符串转成全小写,非字母字符(比如连字符-)会保持不变。- 我们优先构建新表返回,而不是修改原表,这样能避免意外破坏原始数据;如果需要直接修改原表,也可以调整代码逻辑。
内容的提问来源于stack exchange,提问作者Jose Gonzales
相关产品推荐
相关产品推荐

