首页 > 代码库 > lua 如何输出树状结构的table?

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 str
end

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)
	end
end

--打印测试
reserved =  { [100] = { 300, 400}, 200, { 300, 500}, abc = "abc",[0] = {1,2,3,"abc"}}

ccmlog("d","d",reserved)
打印效果如下:




为了让程序模块调用该打印接口,打印函数前加上module("ccmlog", package.seeall),并将此文件保存在类似lualibs的库目录,然后在程序中用require "ccmlog"来调用该函数了.