我尝试将值放在另一个表中的双维表中,但没有重复。我所做的所有尝试都会创建一个包含重复项的表。
以下是一个例子:
这是我的表:
tab1 = {
{id = "id1", dmg = 0, qty = 1},
{id = "id2", dmg = 0, qty = 1},
{id = "id3", dmg = 0, qty = 1},
{id = "id1", dmg = 0, qty = 1},
}
我想要另一张这样的表:
tab2 = {
{id = "id1", dmg = 0, qty = 2},
{id = "id2", dmg = 0, qty = 1},
{id = "id3", dmg = 0, qty = 1},
}
所以我想要对我的数值进行求和,并将表格作为示例中的集合。有人对这个问题有所了解吗?有没有这样做的功能?
感谢您的回答。对不起,如果我的英语不好,那不是我的母语。
答案 0 :(得分:1)
没有内置功能。你必须自己写。这是我的看法。
tab1 = {
{id = "id1", dmg = 0, qty = 1},
{id = "id2", dmg = 0, qty = 1},
{id = "id3", dmg = 0, qty = 1},
{id = "id1", dmg = 0, qty = 1},
}
local a={}
for k,v in ipairs(tab1) do
local id=v.id
if a[v.id]==nil then
a[v.id] = { id=v.id, dmg=v.dmg, qty=v.qty }
else
a[v.id].qty=a[v.id].qty+v.qty
end
end
local tab2={}
local n=0
for k,v in pairs(a) do
n=n+1
tab2[n]=v
end
table.sort(tab2, function (a,b) return a.id < b.id end)
for k,v in ipairs(tab2) do
print(k,v.id,v.dmg,v.qty)
end
答案 1 :(得分:0)
这是一种可能性。 (我假设你的唯一键只是id。如果没有,请相应调整。另外,我只需要添加数量,你可能还需要添加dmg。)
tab1 = {
{id = "id1", dmg = 0, qty = 1},
{id = "id2", dmg = 0, qty = 1},
{id = "id3", dmg = 0, qty = 1},
{id = "id1", dmg = 0, qty = 1},
}
function tablecopy(t)
local ans = {}
for k,v in pairs(t) do
ans[k] = v
end
return ans
end
function nodups(t)
local temp = {} --workspace
for _,t in ipairs(t) do
if temp[t.id] == nil then
temp[t.id] = tablecopy(t)
else
temp[t.id].qty = temp[t.id].qty + t.qty
--temp[t.id].dmg = temp[t.id].dmg + t.dmg
end
end
-- and, if you need to convert to array
local t = {}
for _,v in pairs(temp) do
t[#t+1] = v
end
return t
end
tab2 = nodups(tab1)