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

Làm thế nào để giải nén một đối tượng JavaScript trong ký hiệu daisy-chain / dot thành một đối tượng có các đối tượng và mảng được lồng vào nhau?

Giả sử, chúng ta có một đối tượng như thế này -

const obj = {
   "firstName": "John",
   "lastName": "Green",
   "car.make": "Honda",
   "car.model": "Civic",
   "car.revisions.0.miles": 10150,
   "car.revisions.0.code": "REV01",
   "car.revisions.0.changes": "",
   "car.revisions.1.miles": 20021,
    "car.revisions.1.code": "REV02",
   "car.revisions.1.changes.0.type":
   "asthetic",
   "car.revisions.1.changes.0.desc":
   "Left tire cap",
   "car.revisions.1.changes.1.type":
   "mechanic",
   "car.revisions.1.changes.1.desc":
   "Engine pressure regulator",
    "visits.0.date":
   "2015-01-01",
   "visits.0.dealer":
   "DEAL-001",
   "visits.1.date":
   "2015-03-01",
    "visits.1.dealer":
    "DEAL-002"
};

Chúng tôi được yêu cầu viết một hàm JavaScript nhận một đối tượng như vậy và giải nén nó thành các đối tượng và mảng lồng nhau.

Do đó, đầu ra cho mảng trên sẽ giống như -

const output = {
   firstName: 'John',
   lastName: 'Green',
   car: {
      make: 'Honda',
      model: 'Civic',
      revisions: [
         { miles: 10150, code: 'REV01', changes: ''},
         { miles: 20021, code: 'REV02', changes: [
            { type: 'asthetic', desc: 'Left tire cap' },
            { type: 'mechanic', desc: 'Engine pressure regulator' }
         ]
      } ]
   },
   visits: [
      { date: '2015-01-01', dealer: 'DEAL-001' },
      { date: '2015-03-01', dealer: 'DEAL-002' }
   ]
};

Ví dụ

const obj = {
   "firstName": "John",
   "lastName": "Green",
   "car.make": "Honda",
   "car.model": "Civic",
   "car.revisions.0.miles": 10150,
   "car.revisions.0.code": "REV01",
   "car.revisions.0.changes": "",
      "car.revisions.1.miles": 20021,
   "car.revisions.1.code": "REV02",
   "car.revisions.1.changes.0.type":
    "asthetic",
   "car.revisions.1.changes.0.desc":
   "Left tire cap", "car.revisions.1.changes.1.type":
   "mechanic", "car.revisions.1.changes.1.desc":
   "Engine pressure regulator",
   "visits.0.date": "2015-01-01",
   "visits.0.dealer": "DEAL-001",
   "visits.1.date": "2015-03-01",
   "visits.1.dealer": "DEAL-002"
};
const unflatten = (obj = {}) => {
   const result = {};
   let temp, substrings, property, i;
   for (property in obj) {
      substrings = property.split('.');
   temp = result;
   for (i = 0; i < substrings.length - 1; i++) {
      if (!(substrings[i] in temp)) {
         if (isFinite(substrings[i + 1])) {
             temp[substrings[i]] = [];
         }
         else {
            temp[substrings[i]] = {};
         }
      }
      temp = temp[substrings[i]];
   }
   temp[substrings[substrings.length - 1]] = obj[property];
}
return result;
}; console.log(JSON.stringify(unflatten(obj), undefined, 4));

Đầu ra

Và đầu ra trong bảng điều khiển sẽ là -

{
   "firstName": "John",
   "lastName": "Green",
   "car": {
         "make": "Honda",
      "model": "Civic",
      "revisions": [
         {
            "miles": 10150,
            "code": "REV01",
            "changes": ""
         },
         {
            "miles": 20021,
            "code": "REV02",
            "changes": [
               {
                  "type": "asthetic",
                  "desc": "Left tire cap"
               },
               {
                  "type": "mechanic",
                  "desc": "Engine pressure regulator"
               }
            ]
         }
      ]
   },
   "visits": [
      {
         "date": "2015-01-01",
         "dealer": "DEAL-001"
      }, {
         "date": "2015-03-01",
         "dealer": "DEAL-002"
      }
   ]
}