v2.5.2
Giriş yap

Diziler içinde anahtar/ları yinelenen satırları toplama (Sql sorgusu gibi)

trsherlock
586 defa görüntülendi

Herkese iyi günler.
Görselde görmüş olduğunuz Sql sorgusunda gmkod sütununda aynı olan satırların borçlu ve alacaklı değerleri toplanıyor.
Benzerini javascript ile uygulamak istiyorum.
Aşağıdaki çalışmamı inceleyebilir misiniz?
Ne kadar doğru yaptım bilmiyorum çıktı en azından istediğim gibi.
Daha farklı, daha verimli bir yöntem varsa yardımcı olabilir misiniz?

let data = [
    {gmKod: "600.18", tutar:1000, tip:"A"},
    {gmKod: "391.18", tutar:180, tip:"A"},
    {gmKod: "600.18", tutar:500, tip:"A"},
    {gmKod: "391.18", tutar:90, tip:"A"},
    {gmKod: "600.08", tutar:500, tip:"A"},
    {gmKod: "391.08", tutar:40, tip:"A"},
    {gmKod: "100", tutar:1310, tip:"B"},
    {gmKod: "320", tutar:1000, tip:"B"}
]



let gmKod = data.map((e) => e.gmKod)

let gmKodSet = [...new Set(gmKod)]
let exp = {
    borc: [],
    alacak: []
}
gmKodSet.forEach(e => {
    exp.borc = exp.borc.concat(data.filter(f => {
        return (f.gmKod == e && f.tip == "B")
    }))
    exp.alacak = exp.alacak.concat(data.filter(f => {
        return (f.gmKod == e && f.tip == "A")
    }))
})
//console.log(exp)



let totalBorc = exp.borc.reduce((a, b) => {
    let key = b.gmKod
    if (!a[key]) {
        a[key] = {
            name: "",
            tutar: 0,
            tip: ""
        }
    }
    a[key].name = key
    a[key].tip = b.tip
    a[key].tutar += b.tutar
    return a
}, {})
let totalAlacak = exp.alacak.reduce((a, b) => {
    let key = b.gmKod
    if (!a[key]) {
        a[key] = {
            name: "",
            tutar: 0,
            tip: ""
        }
    }
    a[key].name = key
    a[key].tip = b.tip
    a[key].tutar += b.tutar
    return a
}, {})
//console.log(total)
let newTotal = gmKodSet.map(gm => {
    if(totalBorc[gm]?.tutar) {
        return {
            gmKod: gm,
            tutar: totalBorc[gm]?.tutar,
            tip: totalBorc[gm]?.tip
        }
    }
})
newTotal = newTotal.concat(gmKodSet.map(gm => {
    if (totalAlacak[gm]?.tutar) {
        return {
            gmKod: gm,
            tutar: totalAlacak[gm]?.tutar,
            tip: totalAlacak[gm]?.tip
        }
    }

})).filter(n => n != null)
console.log(newTotal)
/* ÇIKTISI */
[
  { gmKod: '100', tutar: 1310, tip: 'B' },
  { gmKod: '320', tutar: 1000, tip: 'B' },
  { gmKod: '600.18', tutar: 1500, tip: 'A' },
  { gmKod: '391.18', tutar: 270, tip: 'A' },
  { gmKod: '600.08', tutar: 500, tip: 'A' },
  { gmKod: '391.08', tutar: 40, tip: 'A' }
]
trsherlock
155 gün önce

Yeni bir çözüm...

const dizi = [
    {
        "GmKod": "150.20T627",
        "Borclu": 15898.75,
        "Alacakli": 0
    },
    {
        "GmKod": "191.20",
        "Borclu": 1589.87,
        "Alacakli": 0
    },
    {
        "GmKod": "191.20T627",
        "Borclu": 1589.88,
        "Alacakli": 0
    },
    {
        "GmKod": "360.KDV2.62720",
        "Borclu": 0,
        "Alacakli": 1589.88
    },
    {
        "GmKod": "150.20T627",
        "Borclu": 8295,
        "Alacakli": 0
    },
    {
        "GmKod": "191.20",
        "Borclu": 829.5,
        "Alacakli": 0
    },
    {
        "GmKod": "191.20T627",
        "Borclu": 829.5,
        "Alacakli": 0
    },
    {
        "GmKod": "360.KDV2.62720",
        "Borclu": 0,
        "Alacakli": 829.5
    },
    {
        "GmKod": "150.20",
        "Borclu": 500,
        "Alacakli": 0
    },
    {
        "GmKod": "191.20",
        "Borclu": 100,
        "Alacakli": 0
    }
];


const sum = ['Borclu', 'Alacakli'];
const diziTotal = dizi.reduce((a,b)=>{
    const findObj = a.find(r=>r.GmKod==b.GmKod); // eğer boje bulunmuşsa
    if(!findObj){
        a.push(b);
        return a;
    } else {
        for (const key of sum){
            findObj[key] += b[key]
        }
        return a;
    }
}, [])