当我们获取 table 长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度,而且还会出现奇怪的现象。例如:t里面有3个元素,但是因为最后一个下表是5和4,却表现出不一样的长度。
所以通常准确计算table的长度就是通过pairs来遍历(ipairs只能针对从数字1开始的连续索引,碰到不是数字或者不连续的就停止遍历)
local function getTableLength(t)
local length=0
for k,v in pairs(t) do
length = length+1
end
return length
end
local function isEqualTable(tab1,tab2)
local typer1,typer2 = type(tab1),type(tab2)
if "table"~=typer1 and "table"~=typer2 then return tab1==tab2 end
if "table"==typer1 and "table"~=typer2 then return false end
if "table"~=typer1 and "table"==typer2 then return false end
if tab1 == tab2 then return true end
if getTableLength(tab1) ~= getTableLength(tab2) then return false end
for k,v in pairs(tab1) do
local tmp = tab2[k]
return isEqualTable(v,tmp)
end
return true
end
local t1 = {a = 1, b = 2}
local t2 = {b = 2, a = 1}
local t3 = {a = 1, b = 2, c = 3}
local t7={"a","b",c={{a = 1, b = 2}}}
local t8={"a","b",c={{b = 2, a = 1}}}
print(isEqualTable(t1, t2)) -- 输出: true
print(isEqualTable(t1, t3)) -- 输出: false
print(isEqualTable(t7, t8)) -- 输出: true