Lua 如何输出树状结构的table?

Posted Linux大师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua 如何输出树状结构的table?相关的知识,希望对你有一定的参考价值。

为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据。

ccmlog.lua

local function __tostring(value, indent, vmap) local str = '' indent = indent or '' vmap = vmap or {}
--递归结束条件 if (type(value) ~= 'table') then if (type(value) == 'string') then --字符串 str = string.format("[[%s]]", value) else --整数 str = tostring(value) end else if type(vmap) == 'table' then if vmap[value] then return '('..tostring(value)..')' end vmap[value] = true end
local auxTable = {} --保存元表KEY(非整数) local iauxTable = {} --保存元表value local iiauxTable = {} --保存数组(key为0) table.foreach(value, function(i, v) if type(i) == 'number' then if i == 0 then table.insert(iiauxTable, i) else table.insert(iauxTable, i) end elseif type(i) ~= 'table' then table.insert(auxTable, i) end end) table.sort(iauxTable)
str = str..'{\n' local separator = "" local entry = "\n" local barray = true local kk,vv table.foreachi (iauxTable, function (i, k) if i == k and barray then entry = __tostring(value[k], indent..' \t', vmap) str = str..separator..indent..' \t'..entry separator = ", \n" else barray = false table.insert(iiauxTable, k) end end) table.sort(iiauxTable)
table.foreachi (iiauxTable, function (i, fieldName)
kk = tostring(fieldName) if type(fieldName) == "number" then kk = '['..kk.."]" end entry = kk .. " = " .. __tostring(value[fieldName],indent..' \t',vmap)
str = str..separator..indent..' \t'..entry separator = ", \n" end) table.sort(auxTable)
table.foreachi (auxTable, function (i, fieldName)
kk = tostring(fieldName) if type(fieldName) == "number" then kk = '['..kk.."]" end vv = value[fieldName] entry = kk .. " = " .. __tostring(value[fieldName],indent..' \t',vmap)
str = str..separator..indent..' \t'..entry separator = ", \n" end)
str = str..'\n'..indent..'}' end
return strend
ccmlog = function(m,fmt,...) local args = {...} for k,arg in ipairs(args) do if type(arg) == 'table' or type(arg) == 'boolean' or type(arg) == 'function' or type(arg) == 'userdata' then args[k] = __tostring(arg) end end
args[#args+1] = "nil" args[#args+1] = "nil" args[#args+1] = "nil" local str = string.format("[%s]:"..fmt.." %s", m, unpack(args)) print(str)
local off = 1 local p = CCLOGWARN if m == 'error' then p = CCLOGERROR elseif m == 'warn' then p = CCLOGWARN end while off <= #str do local subStr = string.sub(str, off, off+1024) off = off + #subStr --p(subStr) endend
--打印测试reserved = { [100] = { 300, 400}, 200, { 300, 500}, abc = "abc",[0] = {1,2,3,"abc"}}
ccmlog("d","d",reserved)

打印效果如下:


以上是关于Lua 如何输出树状结构的table?的主要内容,如果未能解决你的问题,请参考以下文章

Lua中使用table实现的其它5种数据结构

Cocos2d-x 脚本语言Lua基本数据结构-表(table)

由浅入深的理解Lua的数据结构——table

dump方法打印表格

lua的数据类型

Lua用table实现各种数据结构-多维数组