Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Gom nhóm đối tượng có cùng giá trị _id trong JavaScript

Giả sử có mảng đối tượng:

const arr = [ 
  {_id: "1", S: "2"}, 
  {_id: "1", M: "4"}, 
  {_id: "2", M: "1"}, 
  {_id: "", M: "1"}, 
  {_id: "3", S: "3"} 
];

Viết hàm gom nhóm các đối tượng có cùng giá trị key '_id'. Kết quả mong đợi:

const output = [ 
  {_id: "1", M: "4", S: "2", Total: "6"}, 
  {_id: "2", M: "1", S: "0", Total: "1"}, 
  {_id: "6", M: "1", S: "0", Total: "1"}, 
  {_id: "3", M: "0", S: "3", Total: "3"} 
];

Ví dụ

const arr = [ 
  {_id: "1", S: "2"}, 
  {_id: "1", M: "4"}, 
  {_id: "2", M: "1"}, 
  {_id: "6", M: "1"}, 
  {_id: "3", S: "3"} 
]; 
const pickAllConstraints = arr => { 
  let constraints = []; 
  arr.forEach(el => { 
    const keys = Object.keys(el); 
    constraints = [...constraints, ...keys]; 
  }); 
  return constraints.filter((el, ind) => el !== '_id' && ind === constraints.lastIndexOf(el)); 
}; 
const buildItem = (cons, el = {}, prev = {}) => { 
  const item = {}; 
  let total = 0; 
  cons.forEach(i => { 
    item[i] = (+el[i] || 0) + (+prev[i] || 0); 
    total += item[i]; 
  }); 
  item.total = total; 
  return item; 
}; 
const buildCumulativeArray = arr => { 
  const constraints = pickAllConstraints(arr); 
  const map = {}, res = []; 
  arr.forEach(el => { 
    const { _id } = el; 
    if(map.hasOwnProperty(_id)){ 
      res[map[_id] - 1] = { 
        _id, ...buildItem(constraints, el, res[map[_id] - 1]) 
      }; 
    } else { 
      map[_id] = res.push({ 
        _id, ...buildItem(constraints, el) 
      }); 
    } 
  }); 
  return res; 
}; 
console.log(buildCumulativeArray(arr));

Kết quả

Kết quả in ra console:

[ 
  { _id: '1', M: 4, S: 2, total: 6 }, 
  { _id: '2', M: 1, S: 0, total: 1 }, 
  { _id: '6', M: 1, S: 0, total: 1 }, 
  { _id: '3', M: 0, S: 3, total: 3 } 
]