循环遍历多个 Lua 表格的方法:在循环中使用多个表格名,然后遍历每个表格。

可以通过同一个循环遍历多个 Lua 表吗?

对于遍历索引表,可以像这样操作:

local t1 = {"a", "b", "c"}
local t2 = {"d", "e", "f"}

local num = #t1+#t2
for i=1, num, do
    local j
    local val
    if i <= #t1 then
        j = i
        val = t1[j]
    else
        j = i-#t1
        val = t2[j]
    end

    -- Do stuff
end

但是对于键值表呢?

例如:

local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for key, val in pairs(t1) or pairs(t2) do
    print(key..":  '"..val.."'")
end

结果应该是这样的:

a:  'a'
b:  'b'
c:  'c'
d:  'd'
e:  'e'
f:  'f'
点赞
用户1847592
用户1847592
function pairs(t, ...)
  local i, a, k, v = 1, {...}
  return
    function()
      repeat
        k, v = next(t, k)
        if k == nil then
          i, t = i + 1, a[i]
        end
      until k ~= nil or not t
      return k, v
    end
end

local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for key, val in pairs(t1, t2) do
    print(key..":  '"..val.."'")
end

注意: 此实现不受 __pairs 元方法的影响。

2015-11-21 23:59:35
用户3979429
用户3979429

虽然有类似 Egor 的迭代器总是不错,但更有效率的解决方案将会是:

local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for key, val in pairs(t1) do
    print(key..": "..val)
end
for key, val in pairs(t2) do
    print(key..":  '"..val)
end

这是一个简单、简明且易于理解的方法。

2015-11-22 04:18:35
用户2105552
用户2105552

对于给定的例子,我认为将循环包含在一个外部循环中来迭代表格会更加简洁清晰。

我假设 OP 寻找其他解决方案的主要原因是想避免重复编写内部逻辑。这是一个好的解决方案,只需要添加两行代码:

local t1 = {a="a", b="b", c="c"}
local t2 = {d="d", e="e", f="f"}

for _, tbl in ipairs({ t1, t2 }) do
  for key, val in pairs(tbl) do
    print(key..":  '"..val.."'")
  end
end
2022-02-05 14:36:32