如何在 Lua 的键值对表中弹出/删除下一个项目(任何)?

Posted

技术标签:

【中文标题】如何在 Lua 的键值对表中弹出/删除下一个项目(任何)?【英文标题】:How to pop/remove the next item (any) in a key-value-pair table in Lua? 【发布时间】:2013-12-27 11:42:03 【问题描述】:

在 Lua 中,如何弹出/删除键值对表中的下一项(任何顺序)?

这是否可能无需使用pairs 进行迭代?

【问题讨论】:

键的索引是基于还是基于关联? 关联我认为 - 即“this”=23、“that”=234 等 什么下一个项目?你能举个例子来说明你正在尝试做什么吗?无论如何,要删除表条目,只需执行t[k]=nil,其中t 包含表,k 包含键。 【参考方案1】:

有一个原始函数next,可以调用next(t,k),其中k是表t的一个键,返回表中的下一个键,顺序任意,关联的值用这把钥匙。

如果knilnext(t,k) 返回第一个元素(如果有)。因此,您可以通过调用next(t,nil) 来迭代表,并在下一个键为nil 时结束。

这是一个简单的例子来演示next的使用:

local t = a = "va", b = "vb", c = "vc"

local k,v = next(t,nil)
print(k,v)
k,v = next(t,k)
print(k,v)
k,v = next(t,k)
print(k,v)
k,v = next(t,k)
print(k,v)

输出:

a       va
c       vc
b       vb
nil     nil

【讨论】:

【参考方案2】:

全局函数next 在这里很有用。文档通常很好地解释了它。要迭代地使用它,这是“关键”:

您可以...修改现有字段。特别是,您可以清除 现有字段。

一个简单的弹出函数:

 -- removes and returns an arbitrary key-value pair from a table, otherwise nil
 local pop = function (t)
    local key, value = next(t)
    if key ~= nil then
        t[key] = nil
    end
    return key, value
end

演示:

local test =  "one", c = "see", "two", a = "ayy", b = "bee", "three" 
assert(next(test), "Table was expected to be non-empty")

local key, value = pop(test)
while key do
   print(key, value)
   key, value = pop(test)
end

assert(not next(test), "Table was expected to be empty")

如果你多次运行demo,你可能会看到表格顺序的随意性。

【讨论】:

以上是关于如何在 Lua 的键值对表中弹出/删除下一个项目(任何)?的主要内容,如果未能解决你的问题,请参考以下文章

Dart/Flutter - 如何删除 List 中 Map 元素的键值对?

mongodb如何删除集合中的指定键值对???

如何按 Lua 中的值对表进行排序?

如何将平面/关系表转换为 BigQuery 中的键/值对表?

python练习-查找出字典中值最大的键值对

javascript 删除对象内的键值对