如何通过键删除 lua 表条目?
Posted
技术标签:
【中文标题】如何通过键删除 lua 表条目?【英文标题】:How to remove a lua table entry by its key? 【发布时间】:2010-12-18 01:21:02 【问题描述】:我有一个用作 hashmap 的 lua 表,即带有字符串键:
local map = foo = 1, bar = 2
我想“弹出”该表中由其键标识的元素。有一个table.remove()
方法,但它只需要删除元素的索引(即数字)而不是通用键。我希望能够做到table.remove(map, 'foo')
,这是我实现它的方式:
function table.removekey(table, key)
local element = table[key]
table[key] = nil
return element
end
有没有更好的方法来做到这一点?
【问题讨论】:
+1 给这个非常有用的问题,因为你给出了我需要的“答案”;即使没有“更好”的方法。 在pair operator上下文中这样做安全吗? @Pica 取决于您所说的安全,但您可以说t = 1,2,3,4; for k, v in pairs(t) do t[k] = nil; print(k, v); end
,它会正常工作。
所以它不会破坏执行顺序,遗漏元素或执行元素两次?很抱歉在这件事上坚持不懈。在这个线程中并没有真正讨论 Pairs:***.com/questions/12394841/…。找到了答案:lua-users.org/lists/lua-l/2012-07/msg00543.html 一切都保存了,除了成对添加元素到表格中。
【参考方案1】:
不,将键的值设置为nil
是在表的哈希映射部分中删除项目的公认方法。你在做什么是标准的。但是,我建议不要覆盖 table.remove()
- 对于表的数组部分,默认的 table.remove() 功能包括重新编号索引,您的覆盖不会这样做。如果您确实想将您的函数添加到 table
函数集,那么我可能会将其命名为 table.removekey()
之类的名称。
【讨论】:
感谢有关删除的反馈。关于函数的名称,主要是为了说明我的意思。我通常不会覆盖标准函数。我绝对不会以那个名字使用它(table.removekey()
也是我的最佳选择)。
如果您只在单个块中使用它,则只需将其设为本地函数(节省每次调用的全局查找开销),您的性能会更好。我经常将table.insert
和table.remove
导入到本地命名空间中,如果我经常使用它们,通常是tinsert()
和tremove()
。
感谢您的性能提示。我会尝试将我经常使用的函数导入本地命名空间,看看这是否有很大的不同。
请注意,您应该使用 table.remove(indez, position) 而不是将其设置为 nil,这样索引将递减,因此元素会重新定位。
@HakanBoztepe 这与表的哈希图部分(字符串键)无关。以上是关于如何通过键删除 lua 表条目?的主要内容,如果未能解决你的问题,请参考以下文章
Lodash memoize – 如何删除具有复杂键的缓存条目?