Diziler içinde anahtar/ları yinelenen satırları toplama (Sql sorgusu gibi)
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' }
]
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (3)
Neyse daha az kod ile bir şekilde çözdüğümü düşünüyorum. Yine de önerilere açığım.
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: "108", tutar:1000, tip:"B"}
]
let dataSum = []
data.forEach((arr)=>{
if(dataSum.length != 0) {
$findIndex = dataSum.findIndex(r=> (r.gmKod == arr.gmKod && r.tip == arr.tip))
if($findIndex == -1) {
dataSum.push(arr)
} else {
dataSum[$findIndex].tutar += arr.tutar
}
} else {
dataSum.push(arr)
}
return arr
})
console.log(dataSum)
/* ÇIKTI */
[
{ 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' },
{ gmKod: '100', tutar: 1310, tip: 'B' },
{ gmKod: '108', tutar: 1000, tip: 'B' }
]
Benim de şöyle bir önerim var; sql tarafında böyle sorgular yazıyor isen gerçek seneryoya yakın ve uygulanabilir hazırlamalısın.
Bu hali ile böyle bir sorgu çalıştırırsan monolit bir uygulamayı kitlersin bu sorgu çalıştığında data da şayet göre büyük ise 'WITH(NOLOCK)' ifadesi kullanmayı unutma
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;
}
}, [])