Как реорганизовать массив объектов с помощью lodash? - PullRequest
0 голосов
/ 03 октября 2019

Я получил следующий ответ от моей базы данных:

[
  {
    "id": 1,
    "select": true,
    "insert": true,
    "update": true,
    "delete": false,
    "template": {
      "id": 1,
      "name": "Template 1"
    },
    "module": {
      "id": 1,
      "name": "Module 1"
    }
  }
  {
    "id": 2,
    "select": false,
    "insert": true,
    "update": true,
    "delete": false,
    "template": {
      "id": 1,
      "name": "Template 1"
    },
    "module": {
      "id": 2,
      "name": "Module 2"
    }
  }
  {
    "id": 3,
    "select": true,
    "insert": true,
    "update": false,
    "delete": false,
    "template": {
      "id": 2,
      "name": "Template 2"
    },
    "module": {
      "id": 1,
      "name": "Module 1"
    }
  }  

]

Так что мои root объекты имеют два вложенных объекта (template, module) + свои собственные свойства.

Я хочу преобразовать мой массив таким образом, чтобы template был root объектом, обладал свойством modules с массивом объектов модулей. Module объект должен иметь свойство permissions с select, insert, update, delete подпорками внутри. Как видите, template объекты дублируются. Я хочу избежать дублирования template объектов в моем массиве результатов, они должны быть объединены.

Таким образом, результат должен выглядеть следующим образом:

[
   {
      "id":1,
      "name":"Template 1",
      "modules":[
         {
            "id":1,
            "name":"Module 1",
            "permissions":{
               "select":true,
               "insert":true,
               "update":true,
               "delete":false
            }
         },
         {
            "id":2,
            "name":"Module 2",
            "permissions":{
               "select":false,
               "insert":true,
               "update":true,
               "delete":false
            }
         }
      ]
   },
   {
      "id":2,
      "name":"Template 2",
      "modules":[
         {
            "id":1,
            "name":"Module 1",
            "permissions":{
               "select":true,
               "insert":true,
               "update":false,
               "delete":false
            }
         }
      ]
   }
]

Как этого добиться с помощью lodash?

1 Ответ

1 голос
/ 03 октября 2019

Это не lodash, но я считаю, что простые вещи, как это, должны быть выполнены без внешних зависимостей.

const data = [
  {
    "id": 1,
    "select": true,
    "insert": true,
    "update": true,
    "delete": false,
    "template": {
      "id": 1,
      "name": "Template 1"
    },
    "module": {
      "id": 1,
      "name": "Module 1"
    },
  },
  {
    "id": 2,
    "select": false,
    "insert": true,
    "update": true,
    "delete": false,
    "template": {
      "id": 1,
      "name": "Template 1"
    },
    "module": {
      "id": 2,
      "name": "Module 2"
    },
  },
  {
    "id": 3,
    "select": true,
    "insert": true,
    "update": false,
    "delete": false,
    "template": {
      "id": 2,
      "name": "Template 2"
    },
    "module": {
      "id": 1,
      "name": "Module 1"
    },
  }, 
];

const reorgData = data => {
  return Object.values(
    data.reduce((newObj, { id, module, template, ...permissions }) => {
      if (!newObj[template.name]) {
        newObj[template.name] = template;
        newObj[template.name].modules = [];
      }
     
      newObj[template.name].modules.push({
        ...module,
        permissions,
      });
  
      return newObj;
    }, {})
  );
};

console.log(reorgData(data));
...