Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การจับกลุ่มออบเจกต์ที่มี _id เหมือนกันใน JavaScript

สมมติเรามีอาร์เรย์ของออบเจกต์แบบนี้:

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

เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์แบบนี้เข้ามาและจับกลุ่มออบเจกต์ทั้งหมดที่มีค่า _id เหมือนกันรวมกัน

ผลลัพธ์สุดท้ายควรจะเป็นแบบนี้:

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"}
];

ตัวอย่างโค้ด

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));

ผลลัพธ์

ผลลัพธ์ที่แสดงในคอนโซลจะเป็นดังนี้:

[
  { _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 }
]