如何通过其键删除lua表条目?


94

我有一个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

有更好的方法吗?


4
+1非常有用的问题,因为您给出了我需要的“答案”;即使没有“更好”的方式。
伊恩·博伊德

Answers:


82

不可以,将键的值设置为nil可以删除表的哈希映射部分中的项。您正在做的是标准的。但是,我建议不要重写table.remove()-对于表的数组部分,默认的table.remove()功能包括对索引重新编号,而重写不会这样做。如果您确实想将函数添加到table函数集中,那么我可能会给它起一个类似的名称table.removekey()


感谢您提供有关删除的反馈。关于函数的名称,这主要是为了阐明我的观点。我通常不覆盖标准功能。我绝对不会以该名称使用它(table.removekey()也是我最好的选择)。
Wookai

1
如果仅在单个块中使用它,则只需将其设置为局部函数即可,从而在性能上更好(节省了每次调用的全局查找的开销)。如果经常使用它们,我经常将它们导入table.inserttable.remove导入本地名称空间,就像tinsert()and 一样tremove()
琥珀色

感谢您提供的性能提示。我将尝试将经常使用的函数导入本地名称空间,以查看这是否有很大的不同。
Wookai

请注意,您应该使用table.remove(indez,position)而不是将其设置为nil,这样索引将减少,因此元素将重新放置。

@HakanBoztepe这与表的hashmap部分(字符串键)无关。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.