当在另一个表中找到键和值时,我正尝试将其删除。到目前为止,我一直在使用它,但是尽管它可以识别重复项,但它总是删除表中的最后一项...
function get_key_for_value( t, value )
for k,v in pairs(t) do
if v==value then return k
end
return nil
end
end
for k,v in pairs (Iranian_Protected_Groups) do
v[6] = 0
if Springfield_3_Target_Name == v[2] then
v[6] = v[6] + 1
if v[6] > 0 then
local Key_To_Remove = get_key_for_value (Iranian_Protected_Groups, v)
MESSAGE:New( "Shared target is "..v[2], 40):ToBlue()
table.remove (Iranian_Protected_Groups, Key_To_Remove)
end
end
end
任何帮助将不胜感激!
答案 0 :(得分:4)
首先,您应该使用标准缩进来格式化代码,以使其更易于解析,就像人类阅读代码一样:
function get_key_for_value(t, value)
for k, v in pairs(t) do
if v == value then
return k
end
return nil
end
end
仔细查看for
循环。您将永远不会经过第一次迭代,因为每次迭代return
s。
如果将return nil
语句移到循环外,则您的函数将被固定。 (尽管对于大多数目的来说,它是多余的,因为通常没有值等于返回nil
。)
之前,Key_To_Remove
是nil
。当传递nil
作为要在table.remove
中删除的索引时,Lua将删除最后一个元素。在将列表视为堆栈时,这很方便,但在这种情况下会为您隐藏一个错误。