2

我尝试在另一个表中对一个双维表中的值进行分组,但没有重复。我所做的所有尝试都创建了一个带有重复项的表。

这是一个例子:

这是我的桌子:

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 值进行求和,并像示例中那样对表格进行分组。有人对这个问题有想法吗?有这样做的功能吗?

感谢您的回答。对不起,如果我的英语不好,那不是我的母语。

4

2 回答 2

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
于 2016-12-18T22:40:00.403 回答
0

这是一种可能性。(我假设您的唯一密钥只是 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 = {} --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)
于 2016-12-18T22:37:02.617 回答