基本上我想做的是转换这种格式的表
result={{id="abcd",dmg=1},{id="abcd",dmg=1},{id="abcd",dmg=1}}
到这种格式的表:
result={{id="abcd",dmg=1, qty=3}}
所以我需要知道表中{id="abcd",dmg=1}
出现了多少次。有没有人比嵌套的for
循环知道更好的方法?
答案 0 :(得分:4)
result={{id="abcd",dmg=1},{id="defg",dmg=2},{id="abcd",dmg=1},{id="abcd",dmg=1}}
local t, old_result = {}, result
result = {}
for _, v in ipairs(old_result) do
local h = v.id..'\0'..v.dmg
v = t[h] or table.insert(result, v) or v
t[h], v.qty = v, (v.qty or 0) + 1
end
-- result: {{id="abcd",dmg=1,qty=3},{id="defg",dmg=2,qty=1}}
答案 1 :(得分:0)
所以你想要清除重复的内容,虽然更好的解决方案是不要让欺骗内容进入,在这里你去:
function Originals(parent)
local originals = {}
for i,object in ipairs(parent) do
for ii,orig in ipairs(originals) do
local dupe = true
for key, val in pairs(object) do
if val ~= orig[key] then
dupe = false
break
end
end
if not dupe then
originals[#originals+1] = object
end
end
return originals
end
我试图让代码自我解释,但一般的想法是它循环并将所有带有新内容的对象放在一边,并在之后返回。
警告:代码未经测试