返回 Lua 表中值的索引

我有一个 Lua 表:

local values={"a", "b", "c"}

如果变量等于一个表项,有没有一种方法返回表的索引? 例如

local onevalue = "a"

我如何在表中获取 "a" 或 onevalue 的索引,而不必迭代所有值?

点赞
用户107090
用户107090

在没有迭代的情况下无法完成。

如果您经常需要执行此操作,请考虑构建倒排索引:

local index={}
for k,v in pairs(values) do
   index[v]=k
end
return index["a"]
2016-07-09 16:01:24
用户14022084
用户14022084

如果您在Roblox开发中使用Lua,您可以使用table.find方法:

print(table.find({'a', 'b', 'c'}, 'b'))
2021-09-25 10:41:28
用户5405967
用户5405967

改进的数组和哈希表查找函数

答案是正确的,但是还有改进的空间:

  • 为什么不在找到元素后就退出循环?为什么要将整个源表复制到一个新的临时表中?
  • 通常这样的函数会返回具有该值的_第一个_数组索引,而不是任意一个数组索引。

对于数组:

-- 返回具有给定值的第一个索引(如果找不到,则返回nil)。
function indexOf(array, value)
    for i, v in ipairs(array) do
        if v == value then
            return i
        end
    end
    return nil
end

print(indexOf({'b', 'a', 'a'}, 'a'))  -- 2

对于哈希表:

-- 返回具有给定值的某个键(如果找不到,则返回nil)。如果有多个键具有该值,则返回的特定键是任意的。
function keyOf(tbl, value)
    for k, v in pairs(tbl) do
        if v == value then
            return k
        end
    end
    return nil
end

print(keyOf({ a = 1, b = 2 }, 2))  -- 'b'
2021-10-20 18:49:50