如何在双重维度表中分组值?

我尝试在另一个表格中分组双层维度表的值,但是需要去除重复项。我尝试了所有方法都会创建一个带有重复项的表格。

下面是一个示例:

这是我的表格:

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},
       }

所以我希望我的qty值被汇总并且表格按照示例分组。有人对这个问题有想法吗?有没有函数可以解决这个问题?

谢谢您的答案。如果我的英语不好,那是因为它不是我的母语。

点赞
用户3735873
用户3735873

以下是一种可能的方式。 (我认为您的唯一键只是 id。如果不是,请相应调整。此外,我只添加了 qty,您可能还需要添加 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 = {} --工作区

  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

  --如果您需要转换为数组
  local t = {}
  for _,v in pairs(temp) do
    t[#t+1] = v
  end

  return t
end

tab2 = nodups(tab1)
2016-12-18 22:37:02
用户107090
用户107090

没有内置函数可以实现这个功能,你必须自己编写。以下是我的实现方式。

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
2016-12-18 22:40:00