Computer >> Máy Tính >  >> Lập trình >> Javascript

Nhóm mảng giá trị lồng nhau trong khi so sánh 2 đối tượng - JavaScript

Giả sử, chúng ta có đối tượng JSON sau -

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

Yêu cầu của chúng tôi là nhóm id và tính năng của nó thành một hàng nếu có cùng id trong đối tượng before &after.

Và kết quả đầu ra được yêu cầu có thể được mô tả tốt hơn bằng cách trình bày trực quan sau đây.

Nhóm mảng giá trị lồng nhau trong khi so sánh 2 đối tượng - JavaScript

Chúng tôi được yêu cầu viết một hàm nhóm và sắp xếp dữ liệu theo cùng một cách.

Ví dụ

Sau đây là mã -

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

Đầu ra

Điều này sẽ tạo ra kết quả sau trên bảng điều khiển -

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