如何在不使用pairs/next函数的情况下遍历Lua表的非数字索引?
解决方法
你的原循环跑不起来,是因为#table_arr只能获取表中**连续整数索引(从1开始)**的长度,而你的table_arr只有字符串键,所以#table_arr结果是0,循环直接跳过了。
因为不能用ipairs、pairs、next,那只能通过预先维护键数组的方式来遍历,具体实现如下:
方式1:普通for循环遍历键数组
先把所有字符串键存到一个数组里,再通过这个数组遍历原表:
local table_arr = { a = 3, b = 42, c = 10 } -- 预先定义所有键的数组 local keys = {"a", "b", "c"} -- 遍历键数组获取对应键值 for x = 1, #keys do local key = keys[x] local value = table_arr[key] print(key) -- 依次输出a、b、c print(value) -- 依次输出3、42、10 end
方式2:自定义迭代器函数
如果想用类似pairs的迭代器风格,可以写一个本地迭代器函数:
local table_arr = { a = 3, b = 42, c = 10 } local keys = {"a", "b", "c"} -- 自定义迭代器函数 local function iterate_table(t, key_list) local idx = 0 return function() idx = idx + 1 local key = key_list[idx] if key then return key, t[key] end end end -- 使用迭代器遍历 for key, value in iterate_table(table_arr, keys) do print(key) print(value) end
需要注意:如果后续table_arr的键有新增或删除,要同步更新keys数组,否则会漏遍历或出现nil值。
内容的提问来源于stack exchange,提问作者C0nw0nk
相关产品推荐
相关产品推荐

