如何通过键删除 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.inserttable.remove 导入到本地命名空间中,如果我经常使用它们,通常是tinsert()tremove() 感谢您的性能提示。我会尝试将我经常使用的函数导入本地命名空间,看看这是否有很大的不同。 请注意,您应该使用 table.remove(indez, position) 而不是将其设置为 nil,这样索引将递减,因此元素会重新定位。 @HakanBoztepe 这与表的哈希图部分(字符串键)无关。

以上是关于如何通过键删除 lua 表条目?的主要内容,如果未能解决你的问题,请参考以下文章

Lodash memoize – 如何删除具有复杂键的缓存条目?

如何删除json对象键和值。?

如何删除辅助表中的条目

Spring:如何从联结表中删除条目?

Microsoft Sync Framework 错误删除外键链接表

如何删除重复条目?