2016-12-18 1 views
2

다른 테이블의 이중 차원 테이블에서 값을 그룹화하려고 시도하지만 중복되지는 않습니다. 내가 만든 모든 시도는 중복 된 테이블을 만듭니다. 이 내 테이블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}, 
     } 

그래서 난 내 수량 값을 합산 할을 그리고 예제에서와 같이 groupe 될 테이블. 누군가이 문제에 대한 아이디어가 있습니까? 이것을 할 수있는 함수가 있습니까?

답장을 보내 주셔서 감사합니다. 미안해, 내 영어가 나쁘다면 제 모국어가 아닙니다.

답변

0

한 가지 가능성이 있습니다. (나는 당신의 고유 키 그냥 ID입니다 가정합니다. 그렇지 않을 경우, 그에 따라 조정한다. 또한, 나는 단지 수량을 추가, 당신은 또한 데미지를 추가해야 할 수도 있습니다.)

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

이것은 'tab1'의 내용을 파괴합니다. 아마도 OP는 이것으로 괜찮습니다 ... – lhf

+0

더 나은가요? (나는 당신의 길을 더 짧게 보았습니다 - 상대적으로 짧은 테이블 수의 경우) – tonypdmtr

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 
관련 문제