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

จัดกลุ่มค่าต่อยอดในอาร์เรย์ขณะเปรียบเทียบ 2 ออบเจกต์ - JavaScript

สมมติว่าเรามีออบเจกต์ JSON ดังนี้:

const input = {
  "before": {
    "device": [
      {
        "id": "1234",
        "price": "10",
        "features": [
          { "name": "samsung", "price": "10" },
          { "name": "Apple", "price": "20" }
        ]
      },
      {
        "id": "2154",
        "price": "20",
        "features": [
          { "name": "samsung", "price": "30" },
          { "name": "Moto", "price": "40" }
        ]
      }
    ]
  },
  "after": {
    "device": [
      {
        "id": "1234",
        "price": "50",
        "features": [
          { "name": "samsung", "price": "20" },
          { "name": "Lenovo", "price": "30" }
        ]
      },
      {
        "id": "2158",
        "price": "40",
        "features": [
          { "name": "samsung", "price": "30" }
        ]
      }
    ]
  }
};

ข้อกำหนดของเราคือจัดกลุ่ม id และ features ให้อยู่ในแถวเดียว หาก id เดียวกันมีอยู่ใน before และ after ทั้งคู่

และผลลัพธ์ที่ต้องการสามารถอธิบายได้ดังภาพ

จัดกลุ่มค่าต่อยอดในอาร์เรย์ขณะเปรียบเทียบ 2 ออบเจกต์ - JavaScript

เราต้องเขียนฟังก์ชันที่จัดกลุ่มและจัดเรียงข้อมูลในลักษณะเดียวกัน

ตัวอย่าง

const input = {
  "before": {
    "device": [
      { "id": "1234", "price": "10", "features": [ { "name": "samsung", "price": "10" }, { "name": "Apple", "price": "20" } ] },
      { "id": "2154", "price": "20", "features": [ { "name": "samsung", "price": "30" }, { "name": "Moto", "price": "40" } ] }
    ]
  },
  "after": {
    "device": [
      { "id": "1234", "price": "50", "features": [ { "name": "samsung", "price": "20" }, { "name": "Lenovo", "price": "30" } ] },
      { "id": "2158", "price": "40", "features": [ { "name": "samsung", "price": "30" } ] }
    ]
  }
};
const formatJSON = data => {
  const sub = Object.fromEntries(Object.keys(data).map(k => [k, 0]));
  return Object.values(Object.entries(data).reduce((r, [col, { device }]) => {
    device.forEach(({ id, price, features }) => {
      r[id] = r[id] || [{ id, ...sub }];
      r[id][0][col] = price;
      features.forEach(({ name, price }) => {
        let temp = r[id].find(q => q.name === name);
        if (!temp) {
          r[id].push(temp = { name, ...sub });
        }
        temp[col] = price;
      });
    });
    return r;
  }, {}));
};
console.log(formatJSON(input));

ผลลัพธ์

โค้ดนี้จะแสดงผลลัพธ์ดังต่อไปนี้บนคอนโซล:

[
  [
    { id: '1234', before: '10', after: '50' },
    { name: 'samsung', before: '10', after: '20' },
    { name: 'Apple', before: '20', after: 0 },
    { name: 'Lenovo', before: 0, after: '30' }
  ],
  [
    { id: '2154', before: '20', after: 0 },
    { name: 'samsung', before: '30', after: 0 },
    { name: 'Moto', before: '40', after: 0 }
  ],
  [
    { id: '2158', before: 0, after: '40' },
    { name: 'samsung', before: 0, after: '30' }
  ]
]