如何通过键删除lua表项?

如何通过键删除lua表项?,lua,key,lua-table,Lua,Key,Lua Table,我有一个lua表,用作hashmap,即带有字符串键: local map = { foo = 1, bar = 2 } 我想“弹出”此表中由其键标识的元素。有一个table.remove()方法,但它只获取要删除的元素的索引(即一个数字),而不获取通用键。我希望能够执行table.remove(映射'foo'),下面是我如何实现它的: function table.removekey(table, key) local element = table[key] table[k

我有一个lua表,用作hashmap,即带有字符串键:

local map = { foo = 1, bar = 2 }
我想“弹出”此表中由其键标识的元素。有一个
table.remove()
方法,但它只获取要删除的元素的索引(即一个数字),而不获取通用键。我希望能够执行
table.remove(映射'foo')
,下面是我如何实现它的:

function table.removekey(table, key)
    local element = table[key]
    table[key] = nil
    return element
end

有更好的方法吗?

否,将键的值设置为
nil
是删除表的hashmap部分中的项的公认方法。你所做的是标准的。但是,我建议不要重写
table.remove()
——对于表的数组部分,默认的table.remove()功能包括对索引进行重新编号,而重写不会这样做。如果您确实想将函数添加到
函数集中,那么我可能会将其命名为
table.removekey()
或类似的名称。

感谢您对删除操作的反馈。关于函数的名称,这主要是为了阐明我的观点。我通常不重写标准函数。我绝对不会在这个名称下使用它(
table.removekey()
也是我的最佳选择)。如果您只在单个块中使用它,只需将其改为本地函数(节省每次调用的全局查找开销),性能方面会更好。我经常导入
表。插入
表。如果我经常使用它们,则将它们删除到本地名称空间中,通常类似于
tinsert()
tremove()
。感谢性能提示。我将尝试将我经常使用的函数导入本地名称空间,看看这是否有很大的区别。请注意,您应该使用table.remove(indez,position),而不是将其设置为nil,这样索引将递减,因此元素将重新定位。@HakanBoztepe,它与表的hashmap部分不相关(字符串键)。+1是非常有用的问题,因为你给出了我需要的“答案”;即使没有“更好”的方法。在pairs运算符上下文中这样做安全吗?@Pica取决于你所说的安全,但你可以说
t={1,2,3,4};对于成对的k,v(t),不要[k]=nil;print(k,v);end
,它会很好地工作。因此它不会破坏执行顺序、遗漏元素或执行元素两次?很抱歉,我坚持这样做。此线程中没有真正讨论对:。找到了答案:所有内容都已保存,除了以对的形式将元素添加到表中。