lua遍历table的几种方式

lua遍历table的几种方式

lua中的table是一张hash表,遍历table是一个非常常见的操作,但是由于table其中的内容不同,其遍历方式也不尽相同;而且若使用了错误的遍历方式,还会导致意外中断遍历,让结果不符合预期。

本文主要是简单介绍一下lua table的几种遍历方式

总览

lua常用的遍历方式有三种,使用ipairs遍历、使用pairs遍历、使用i=1,#xxx遍历

ipairs遍历

pairs根据tbtest中key的hash值排列的顺序来遍历,并非创建table时各个元素的顺序

for key, value in pairs(tbtest) do      
    XXX  
end  

pairs遍历

ipairs会从table数组(lua的hash表和数组都是用的table)下标1开始,一直遍历到key不连续为止(即下表非数字)

for key, value in ipairs(tbtest) do      
    XXX  
end 

“i=1,#xxx遍历”

这种遍历依赖于#xxx获取到的长度,通常建议用于数组型table,且下表连续。否则可能表现不一致。或者容易取出nil值

for i=1, #(tbtest) do      
    XXX  
end  

说到这里,看一下两组验证代码:

tbtest1 = {
    a = "a",
    [1] = "1",
    b = "b", 
    c = "c",
    [2] = "2",
    [4] = "4",
}

print("pairs(tbtest1)")
for key, value in pairs(tbtest1) do      
    print(tostring(key)..":"..tostring(value))
end  
print("ipairs(tbtest1)")
for key, value in ipairs(tbtest1) do      
    print(tostring(key)..":"..tostring(value))
end  
print("i=1,#(tbtest1)")
for i=1, #tbtest1 do 
    print(tostring(i)..":"..tostring(tbtest1[i]))
end  

第一组,数组下标和字符串下标混用,这种混合的下标方式首先不建议这么写,如果table内容如此混乱的话,建议使用pairs进行遍历

输出结果:

pairs(tbtest1)
1:1
2:2
4:4
c:c
b:b
a:a
ipairs(tbtest1)
1:1
2:2
i=1,#(tbtest1)
1:1
2:2
3:nil
4:4

pairs可以遍历所有成员;ipairs只遍历1,2,数值型下标,下一个3不连续就中断了;由于#tbtest获取的值为4,故下标3的值为nil


看另一个例子

local tbtest2 = {}
for i=1, 5 do 
    tbtest2[i] = i
end 

tbtest2[7] = 7
print("pairs(tbtest2)")
for key, value in pairs(tbtest2) do      
    print(tostring(key)..":"..tostring(value))
end  
print("ipairs(tbtest2)")
for key, value in ipairs(tbtest2) do      
    print(tostring(key)..":"..tostring(value))
end  
print("i=1,#(tbtest2)")
for i=1, #tbtest2 do 
    print(tostring(i)..":"..tostring(tbtest2[i]))
end 


tbtest2[6] = 6
print("ipairs(tbtest2)")
for key, value in ipairs(tbtest2) do      
    print(tostring(key)..":"..tostring(value))
end  
print("i=1,#(tbtest2)")
for i=1, #tbtest2 do 
    print(tostring(i)..":"..tostring(tbtest2[i]))
end 

打印输出

pairs(tbtest2)
1:1
2:2
3:3
4:4
5:5
7:7
ipairs(tbtest2)
1:1
2:2
3:3
4:4
5:5
i=1,#(tbtest2)
1:1
2:2
3:3
4:4
5:5
ipairs(tbtest2)
1:1
2:2
3:3
4:4
5:5
6:6
7:7
i=1,#(tbtest2)
1:1
2:2
3:3
4:4
5:5
6:6
7:7

pairs先按顺序输出值,然后再按键值对的hash顺序输出键值对

ipairs只会按照顺序输出值,若下标是nil值(也可以理解为下标不连续)则中断。

补充:lua 中pairs 和 ipairs区别

常用用法:pairs用于迭代元素,ipairs用于迭代数组

参照LUA手册的解释:

ipairs (t)

Returns three values: an iterator function, the table t, and 0, so that the construction

for i,v in ipairs(t) do body end
will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table.

pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;

pairs (t)

Returns three values: the next function, the table t, and nil, so that the construction

for k,v in pairs(t) do body end
will iterate over all key–value pairs of table t.

See function next for the caveats of modifying the table during its traversal.

ipairs则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key

你可能感兴趣的:(lua)