Lua中如何检查表中是否包含特定值
2020-11-6 16:10:45
收藏:0
阅读:206
评论:3
我正在寻找一种方法来查看数组(表)中是否有特定值
该示例表有3个条目,每个条目包含具有多个条目的表
假设我正在检查是否在'data'中有'apple'
data = {
{"alpha","bravo","charlie","delta"},
{"apple","kiwi","banana","pear"},
{"carrot","brocoli","cabage","potatoe"}
}
这是我拥有的代码 - 递归查询。 问题在于该函数中某处出现问题,因为它删除了正值
local function hasValue(tbl, str)
local f = false
for ind, val in pairs(tbl) do
if type(val) == "table" then
hasValue(val, str)
else
if type(val) == "string" then
if string.gsub(val, '^%s*(.-)%s*$', '%1') == string.gsub(str, '^%s*(.-)%s*$', '%1') then
f = true
end
end
end
end
return f end
任何关于该问题或者替代方法的帮助将不胜感激。
这里是完整的测试文件
点赞
用户2898815
感谢 @codeflush.dev 的回答
-- 判断table中是否包含指定的字符串
local function hasValue(tbl, str)
local f = false
for ind, val in pairs(tbl) do
if type(val) == "table" then
f = hasValue(val, str)
else
if type(val) == "string" then
if string.gsub(val, '^%s*(.-)%s*$', '%1') == string.gsub(str, '^%s*(.-)%s*$', '%1') then
f = true
end
end
end
end
return f
end
2020-11-06 16:26:28
用户3342050
local function hasValue( tbl, str )
local f = false
for i = 1, #tbl do
if type( tbl[i] ) == "table" then
f = hasValue( tbl[i], str ) -- 返回递归值
if f then break end -- 如果返回 true,则跳出循环
elseif tbl[i] == str then
return true
end
end
return f
end
print( hasValue( data, 'apple' ) )
print( hasValue( data, 'dog' ) )
true
false
2020-11-06 16:41:26
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

帮助:
string.gsub并匹配整个字符串,但不包括尾部空格。在你的例子中,你根本没有尾部空格,因此这是一个无意义的函数调用和比较。在这种情况下,你应该直接字符串比较if val == str then。f = true时,函数仍然会运行直到遍历完所有项,因此即使它找到了某些东西,它也会浪费你的 CPU 时间。你应该使用return true,因为它找到了该项,不需要继续。解决方案 1:
lookup = {}的表,并在你执行table.insert(a, b)之前/之后,迭代b并将所有项添加到查找表中。for k, v in ipairs(b) do lookup[v] = true end这将从
b中提取值作为lookup中的键,值true只是指示我们有该键。 稍后,如果您想知道是否有此项,只需执行print("Has brocoli:", lookup["brocoli"])。解决方案 2:
function hasValue(tbl, value) for k, v in ipairs(tbl) do -- 迭代表(仅适用于顺序表) if v == value or (type(v) == "table" and hasValue(v, value)) then -- 直接将表中的值与我们正在查找的值进行比较,否则如果值是表,则检查其内容是否为该值。 return true -- 在此或嵌套表格中找到 end end return false -- 没有找到 end注:此函数不能处理非顺序数组。对于你的代码,它将有效。