【问题标题】:How to reorganize array of objects with lodash?如何用 lodash 重新组织对象数组?
【发布时间】:2019-10-03 22:41:57
【问题描述】:

我的数据库收到以下回复:

[
  {
    "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 对象有两个嵌套对象(templatemodule)+ 它们自己的属性。

我想将我的数组转换为 template 应该是 root 对象,应该有 modules 属性和模块对象数组。 Module 对象应该有属性 permissionsselect, 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 实现这一点?

【问题讨论】:

    标签: javascript node.js lodash


    【解决方案1】:

    这不是 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));

    【讨论】:

    • 感谢您的回答。我的框架经常使用 lodash,是否有任何理由不使用它来做简单的事情,或者它只是您的偏好?
    • 主要是一种偏好,但这种偏好是基于 lodash 有点矮胖,现在有 vanilla js 来做 lodash 过去提供的东西。如果你已经在你的项目中使用了 lodash,你可以通过直接导入使用的特定 lodash 函数来帮助减轻它的重量,特别是如果你的项目使用了 tree shaking。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多