อาร์เรย์: [{'TR-01':1}, {'TR-02':3}, {'TR-01':3}, {'TR-02':5}]
รวมค่าของ key เดียวกัน: [{'TR-01':4}, {'TR-02':8}]
ตัวอย่างโค้ด
const arr = [{'TR-01':1}, {'TR-02':3}, {'TR-01':3}, {'TR-02':5}];
const sumDuplicate = arr => {
const map = {};
for (let i = 0; i < arr.length; ) {
const key = Object.keys(arr[i])[0];
if (!map.hasOwnProperty(key)) {
map[key] = i++;
continue;
}
arr[map[key]][key] += arr[i][key];
arr.splice(i, 1);
}
};
sumDuplicate(arr);
console.log(arr);ผลลัพธ์
[ { 'TR-01': 4 }, { 'TR-02': 8 } ]คำอธิบาย: ใช้ object map เก็บ index แรกของแต่ละ key วนลูป while-style (i ไม่เพิ่มถ้าสplice) หา key ซ้ำ บวกค่า ลบตัวซ้ำด้วย splice
วิธีทันสมัย: Object.values(arr.reduce((acc, o) => { const k = Object.keys(o)[0]; acc[k] = (acc[k] || 0) + o[k]; return acc; }, {})).map((v, i) => ({[Object.keys(arr.find(o => o[k]==v))[0]]: v})) - ซับซ้อนกว่า แนะนำ用 reduce สร้าง map แล้วแปลงกลับ