Lua 表的遍历

遍历表

1. pairs 迭代器遍历

pairs 适用于遍历含有键值对的表

local t = {
    "apple",
    x = 10,
    y = 20,
    "banana",
    "grape",
}

for k, v in pairs(t) do
    print(k, v)
end

运行结果:

lua.exe table.lua

1       apple
2       banana
3       grape
y       20
x       10

ipairs 遍历表中的键值对,遍历过程中元素的出现顺序可能是随机的,相同的程序每次运行也可能产生不同的顺序;

唯一确定的是,在遍历的过程中每个元素只会出现一次;

另外:“apple”、“banana”、“grape”他们的键为去除含有键元素后的表索引值

2. ipairs 迭代器遍历

ipairs 适用于遍历列表

例子1:
local t = {
    "apple",
    x = 10,
    y = 20,
    "banana",
    "grape",
}

for i, v in ipairs(t) do
    print(i, v)
end

运行结果:

lua.exe table.lua

1       apple
2       banana
3       grape

例子2:
local t = { 5, 6, 7, 8 }

for i, v in ipairs(t) do
    print(i, v)
end

运行结果:

lua.exe table.lua

1       5
2       6
3       7
4       8

例子3:
local t = {
    [2] = 5,
    [7] = 8,
    [100] = 50,
}

for i, v in ipairs(t) do
    print(i, v)
end

运行结果:为空


例子4:
local t = {
    [1] = 5,
    [7] = 8,
    [100] = 50,
}

for i, v in ipairs(t) do
    print(i, v)
end

运行结果:

lua.exe table.lua

1       5

ipairs 顺序遍历列表,但是如果列表第一个元素的索引下标不为 1,

或者再遍历过程中,下一个索引对应的值为nil,则停止遍历

3. for 循环遍历

for 循环遍历也是一种顺序遍历方式,比 ipairs 遍历方式更为灵活

例子1:
local t = {
    [1] = 5,
    [7] = 8,
    [100] = 50,
}

for i = 1, 100 do
    if t[i] ~= nil then
        print(i, t[i])
    end
end

运行结果:

lua.exe table.lua

1       5
7       8
100     50

例子2:
local t = {
    "apple",
    "banana",
    "grape",
}

for i = 1, #t do
    print(i, t[i])
end

运行结果:

lua.exe table.lua

1       apple
2       banana
3       grape


例子3:
local t = {
    "apple",
    "banana",
    "grape",
    "orange",
}

for i = 1, #t, 2 do
    print(i, t[i])
end

运行结果:

lua.exe table.lua

1       apple
3       grape

for 以索引下标进行对表的访问遍历,对比 ipairs 更加灵活,

当以for i = 1, #t do这种形式进行访问时,其实和 ipairs 的访问方式一样

打印表

local t = {
    "apple",
    "banana",
    x = 10,
    y = 20,
    z = {
        x = 15,
        "apple",
        y = 20,
    },
    "grape",
    "orange",
    w = {
        w = {
            x = 10,
            y = 20,
        }
    }
}

function PrintTable(t, depth)
    if (t == nil) or (type(t) ~= "table") then
        return t
    end
    for k, v in pairs(t) do
        if type(v) == "table" then
            PrintDepth("[" .. k .. "] = {", depth)
            PrintTable(v, depth + 1)
            PrintDepth("}", depth)
        else
            PrintDepth("[" .. k .. "]" .. " = " .. v, depth)
        end
    end
    return
end

function PrintDepth(str, depth)
    local info = ""
    for i = 1, depth do
        info = info .. "  "
    end
    print(info .. str)
end

PrintTable(t, 0)

运行结果

lua.exe table.lua

[1] = apple
[2] = banana
[3] = grape
[4] = orange
[y] = 20
[x] = 10
[w] = {
  [w] = {
    [y] = 20
    [x] = 10
  }
}
[z] = {
  [1] = apple
  [y] = 20
  [x] = 15
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值