lua有多种遍历table的方法,比如ipairs,pairs,拿到table的长度#table等等。这几种遍历的方式遇到不同的情况遍历出来的结果也不一样,具体是怎么回事呢,下面就将所有的情况都分析一遍。
首先就是遍历的元素不是K,V的形式,在lua中如果被遍历的元素不是键值对的形式,那么lua会顺序遍历元素。看几个示例一目了然。
1. table中都是一个个的单元素
--table中都是一个个的单元素
table_view = {
"w",
"e",
"r",
1,
2,
3,
}
for i, v in ipairs(table_view) do
print(v)
end
运行结果:
会发现,是按顺序遍历的。
2. table中的元素还是table的情况
--table中的元素还是table
local cfg2 = {
{ss = "a"},
{ss = "b"},
{ss = "c"},
{ss = "d"},
{ss = "e"},
}
for k,v in pairs(cfg2) do
if v then
print(v.ss)
end
end
运行结果:
结果依然是顺序打印。
3. table中的元素是键值对的情况
--table中的元素是键值对的情况
local cfg = {a="a",b="b",c="c",d="d",e="e"}
for k,v in pairs(cfg) do
print("k:"..k.."----".."v:"..v)
end
运行结果:
会发现不是顺序遍历了。
当table中的元素有多种类型的情况
table_view = {
"w",
"e",
"r",
color1 = "red",
color2 = "blue",
color3 = "yellow",
color4 = "pink",
{"a1", "a2", "a3"},
{"b1", "b2", "b3"},
{"c1", "c2", "c3"},
}
for i, v in pairs(table_view) do
if type(v) == "table" then
for new_table_index, new_table_value in pairs(v) do
print(new_table_value)
end
else
print(v)
end
end
运行结果:
结果显示:如果元素不为键值对,则按顺序遍历元素,将其他元素遍历完毕之后再随机遍历键值对元素。
疑问:
为什么元素分键值对和非键值对?
其实lua在遍历的时候都是按照键值对来遍历的,即K-V的形式,上述案例中的单元素 “w” , “e” , “r” 其实是元素的值,当没有主动声明 "Key"时,lua会给这些单元素添加默认值。我们可以打印这些单元素的 “key”。
table_view = {
"w",
"e",
"r",
1,
2,
3,
}
for i, v in ipairs(table_view) do
print(i.."---"..v)
end
运行结果:
结果证明了上面的观点。而且发现 “key” 的默认值不是随便给的,而是从1开始赋值。
这里要补充lua的一个知识点-----lua想要顺序遍历table中的每个元素有一个前提条件,即元素的 “key” 是从“1”开始,第几个元素"key"就是几。比如第三个元素“r” 的 “key”就是“3”。这样就解释了lua在遍历单元素的时候为什么会是顺序遍历。
比如这样:
table_view = {
[1]="w",
[2]="e",
[3]="r",
[4]=1,
[5]=2,
}
for i, v in ipairs(table_view) do
print(i.."---"..v)
end
结果键值对的也是顺序遍历
总结:想要顺序遍历table中的元素,如果元素中有K,V那么需要观察K是不是满足从“1”开始,第几个元素"key"就是几的条件,否则元素不会顺序遍历。