【问题标题】:How to filtering between array of sub arrays and array of sub arrays in javascript?如何在javascript中的子数组数组和子数组数组之间进行过滤?
【发布时间】:2020-03-24 12:28:59
【问题描述】:

我有两个对象数组。我想根据PermissionObj过滤数据。

这是来自数据库。这是permissionObj中的子数组数组。

const PermissionObj = {
  permission: [
    {
      books: [
        {
          label: "Can View",
          value: "can_view"
        }
      ]
    },
    {
      Journals: [
        {
          label: "Can View",
          value: "can_view"
        },
        {
          label: "Can Create",
          value: "can_create"
        }
      ]
    },
    {
      deal: [
        {
          label: "Can update",
          value: "can_update"
        },
        {
          label: "Can delete",
          value: "can_delete"
        }
      ]
    }
  ]
}

这是静态数据。我想根据PermissionObj比较这个数据。

const data = [
  {
    label: "books",
    value: "can_view"
  },
  {
    label: "deal",
    content: [
      {
        value: "can_update"
      },
      {
        value: "can_delete"
      },
      { value: "can_view" }
    ]
  },
  {
    label: "Articles"
  },
  {
    label: "Journals",
    content: [
      {
        value: "can_create"
      },
      {
        value: "can_view"
      },
      {
        value: "can_delete"
      },
      {
        value: "can_edit"
      }
    ]
  }
]

我正在尝试根据PermissionObj 对象数组过滤对象的数据数组。这是我尝试的代码。

const permKeys = PermissionObj.permission.flatMap(item => Object.keys(item));
const filteredData = data.filter(({ label }) => permKeys.includes(label));
console.log(filteredData);

这是我的问题,我遇到的问题是,如果 can_editcan_delete 与日志中的权限对象不匹配,我不想获得它。在我的权限对象中,期刊中没有can_editcan_delete

我接受的输出将是这种格式:

const data = [
  {
    label: "books",
    value: "can_view"
  },
  {
    label: "deal",
    content: [
      {
        value: "can_update"
      },
      {
        value: "can_delete"
      }
    ]
  },
  {
    label: "Journals",
    content: [
      {
        value: "can_create"
      },
      {
        value: "can_view"
      }
    ]
  }
]

【问题讨论】:

    标签: javascript arrays node.js reactjs object


    【解决方案1】:

    可以使用reduce 方法并应用逻辑来决定应该推送哪些数据:

    const result = data.reduce((a, c) => {
       let filterObj = PermissionObj.permission.find(f => f[c.label]);
       if (filterObj) {
          if (c.value) {
             a.push(c);
          }
          if (c.content) {
             c.content = c.content.filter(f => filterObj[c.label]
                 .some(s => s.value.toLowerCase() == f.value.toLowerCase()));
             a.push(c);
          }
       }
       return a;
    },[])
    

    一个例子:

    const PermissionObj = {
       permission: [
       {
          "books": [
             {
                "label": "Can View",
                "value": "can_view"
             }
          ]
       },
       {
          "Journals": [
             {
                "label": "Can View",
                "value": "can_view"
             },
             {
                "label": "Can Create",
                "value": "can_create"
             }
          ]
       },
       {
          "deal": [
             {
                "label": "Can update",
                "value": "can_update"
             },
             {
                "label": "Can delete",
                "value": "can_delete"
             }
          ]
       }
     ]
    };
    
    const data = [
       {
          label: "books",
          value: "can_view"
       },
       {
          label: "deal",
          content: [
             {
             value: "can_update"
             },
             {
                value: "can_delete"
             },
             {
                value:"can_view"
             }
          ]
       },
       {
          label: "Articles",
       },
       {
          label: "Journals",
          content: [
             {
                value: "can_create"
             },
             {
                value: "can_view"
             },
             {
                value: "can_delete"
             },
             {
                value: "can_edit"
             }
          ]
       }
    ];
    
    
    const result = data.reduce((a, c) => {
       let filterObj = PermissionObj.permission.find(f => f[c.label]);
       if (filterObj) {
          if (c.value) {
             a.push(c);
          }
          if (c.content) {
             c.content = c.content.filter(f => filterObj[c.label].some(s => s.value.toLowerCase() == f.value.toLowerCase()));
             a.push(c);
          }
       }
       return a;
    },[])
    console.log(result);

    【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2017-02-14
    • 2017-10-29
    • 2020-07-08
    • 2022-01-08
    • 2019-11-08
    • 2019-08-10
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多