让我们说一张桌子:
t = {
{ name = "Bob", age = 34, gender = "Male"},
{ name = "Bill", age = 40, gender = "Male"},
{ name = "Barbara", age = 20, gender = "Female"}
}
使用name作为索引,我需要做什么才能返回或打印Bob的年龄或Barbara的性别?
更确切地说,当名称为“Bob”或其他任何名称时,调用年龄和性别的函数。
答案 0 :(得分:3)
根据您的表格,执行此操作
for i=1,#t do
t[t[i].name]=t[i]
end
然后您可以使用名称访问字段:
print(t["Bob"].age, t["Bob"].gender)
答案 1 :(得分:2)
有几种方法可以解决这个问题。显而易见的方法是遍历表中的所有元素,直到找到正确的元素:
function FindByName(name)
for i = 1, #t do
if(t[i].name == name) then return t[i] end
end
assert(false, "Could not find name " .. name)
end
因此,您可以致电FindByName("Bob").gender
来获取该特定字段。
但是,如果您知道要按名称查找,那么您可以修改数组以使名称具有相同的键。构建数组后,调用此函数:
function MapToName(t)
for i = 1, #t do
t[t[i].name] = t[i]
end
end
这样您就可以使用t[the_name]
查看输入内容。
这种方法的缺点是,每次添加元素,删除元素或更改元素名称时,都需要相应地修改表格。如果您更改了元素的名称,则必须将t[old_name]
设置为nil
,并将t[new_name]
设置为该值。
但对于静态表,这没关系。