2016-12-18 7 views
2

Ich versuche, Werte in einer Doppeldimensionstabelle in einer anderen Tabelle zu gruppieren, aber ohne Duplikate. Alle Versuche, die ich gemacht habe, erstellen eine Tabelle mit Duplikaten.Wie gruppiert man Werte in der Doppeldimensionstabelle?

Hier ist ein Beispiel: wie das

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

und ich möchte eine andere Tabelle:

tab2 = { 
     {id = "id1", dmg = 0, qty = 2}, 
     {id = "id2", dmg = 0, qty = 1}, 
     {id = "id3", dmg = 0, qty = 1}, 
     } 

So möchte ich summiert werden meine Menge Werte

Das ist mein Tisch ist und Tabellen wie im Beispiel gruppiert werden. Hat jemand eine Idee für dieses Problem? Gibt es eine Funktion, dies zu tun?

Vielen Dank für Ihre Antworten. Sorry, wenn mein Englisch schlecht ist, ist es nicht meine Muttersprache.

Antwort

0

Hier ist eine Möglichkeit. (Ich gehe davon aus Ihrem eindeutigen Schlüssel ist nur id. Wenn nicht, entsprechend anpassen. Auch ich nur Menge hinzuzufügen, können Sie auch dmg hinzufügen müssen.)

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) 
+0

Dies zerstört den Inhalt von 'tab1'. Vielleicht ist das OP in Ordnung mit diesem ... – lhf

+0

Besser jetzt? (Ich sehe Ihren Weg, kürzer - für relativ kurze Anzahl von Schlüsseln in der Untertabelle.) – tonypdmtr

1

Es gibt keine eingebaute Funktion für diesen. Sie müssen Ihre eigenen schreiben. Hier ist meine Meinung.

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 
Verwandte Themen