Lua 如何通过 table 值检索 table 行?

Lua how do you retrieve a table row by a table value?

示例:

mytable = {{id=100,wordform="One Hundread"},{id=200,wordform="Two Hundread"}}

我希望能够访问基于 id 的行来做这样的事情:

mynum = 100
print ("The value is " .. mytable[mynum].wordform)

这里的要点是我希望能够设置索引值,这样我以后就可以像使用 java 哈希图一样检索相关值。

你可以使用metatable

setmetatable(mytable, {__index = function(tbl, id)
    for _, item in pairs(tbl) do
      if type(item) == "table" and item.id == id then
        return item
      end
    end
end})

然后

mynum = 100
print ("The value is " .. mytable[mynum].wordform) -- The value is One Hundread

理想情况下,您的 table 应该只使用 ID 作为键:

local mytable = {[100] = {wordform = "One hundred"}, [200] = {wordform = "Two hundred"}}
print("The value is " .. mytable[100].wordform)

如果您的 table 是列表形式,您可以很容易地将其转换为 ID 形式:

local mytable_by_id = {}
for _, item in pairs(mytable) do mytable_by_id[item.id] = item end

使用 Lua table 的散列部分绝对比在线性时间内循环列表条目更可取,正如 Renshaw 的回答所暗示的那样(事实上它隐藏在 meta[=23= 后面) ] 可能会隐藏糟糕的性能并欺骗 reader 相信哈希索引操作正在此处进行)。

此外,该答案甚至无法正常工作,因为列表部分也使用整数键;作为有效列表部分索引的 ID 可能 return 是错误的元素。您必须使用函数而不是 metatable.