首页 > 解决方案 > 在对象javascript express中过滤嵌套数组

问题描述

考虑以下对象:

[
  {
    id: 5fc0be2990a8a12cc0ba0b5c,
    projectName: 'E-271120-B',
    projectManagaer: '5f7f1ba973ff621da4322248',
    dataInici: 2020-11-26T23:00:00.000Z,
    dataEntrega: 2020-11-26T23:00:00.000Z,
    dtoGlobal: null,
    dtoProjecte: null,
    archived: false,
    created: 2020-11-27T08:51:57.242Z,
    updated: 2021-01-25T10:01:18.733Z
    tabs: [{permissionsUserID:[250,8]},{permissionsUserID:[3]}],
    __v: 3
  },
  {
    tabs: [{permissionsUserID:[3,350]},{permissionsUserID:[15]}],
    _id: 5fc0be4690a8a12cc0ba0b5f,
    projectManagaer: '5f7f0e69b5862e1a085db388',
    projectName: 'E-271120-C',
    dataInici: 2020-11-27T23:00:00.000Z,
    dataEntrega: 2020-11-29T23:00:00.000Z,
    dtoGlobal: null,
    dtoProjecte: null,
    archived: false,
    created: 2020-01-21T08:46:41.958Z,
    updated: 2021-01-21T08:46:41.958Z,
    __v: 2
  },
  {
    tabs: [{permissionsUserID:[31,350]},{permissionsUserID:[8,893]}],
    _id: 5fc0be4690a8a12cc0ba0b5f,
    projectManagaer: '5f7f0e69b5862e1a085db388',
    projectName: 'E-23410-C',
    dataInici: 2020-11-27T23:00:00.000Z,
    dataEntrega: 2020-11-29T23:00:00.000Z,
    dtoGlobal: null,
    dtoProjecte: null,
    archived: false,
    created: 2020-01-21T08:46:41.958Z,
    updated: 2021-01-21T08:46:41.958Z,
    __v: 2
  }
]

每个对象代表一个项目。一个项目有很多选项卡。

我只想返回至少一个选项卡中包含的项目 permissionsUserID 记录的用户的 ID。

因此,如果登录的用户的 ID 为 8,则这些是我想要获取的项目:

[
  {
    id: 5fc0be2990a8a12cc0ba0b5c,
    projectName: 'E-271120-B',
    projectManagaer: '5f7f1ba973ff621da4322248',
    dataInici: 2020-11-26T23:00:00.000Z,
    dataEntrega: 2020-11-26T23:00:00.000Z,
    dtoGlobal: null,
    dtoProjecte: null,
    archived: false,
    created: 2020-11-27T08:51:57.242Z,
    updated: 2021-01-25T10:01:18.733Z
    tabs: [{permissionsUserID:[250,8]},{permissionsUserID:[3]}],
    __v: 3
  },
{
    tabs: [{permissionsUserID:[31,350]},{permissionsUserID:[8,893]}],
    _id: 5fc0be4690a8a12cc0ba0b5f,
    projectManagaer: '5f7f0e69b5862e1a085db388',
    projectName: 'E-23410-C',
    dataInici: 2020-11-27T23:00:00.000Z,
    dataEntrega: 2020-11-29T23:00:00.000Z,
    dtoGlobal: null,
    dtoProjecte: null,
    archived: false,
    created: 2020-01-21T08:46:41.958Z,
    updated: 2021-01-21T08:46:41.958Z,
    __v: 2
  }
]

这就是我所做的过滤器:

async getAll(pagination, user) {
    try {
      const filter = {};
      if(pagination.archived) {
        filter['archived'] = pagination.archived;
      }
      if(pagination.search) {
        filter['$text'] = {$search: pagination.search}
      }

      const { Project: projectSchema } = this.getSchemas();
    

      const projectsDocs = await projectSchema.paginate(filter, {
        limit: pagination.limit ? parseInt(pagination.limit) : 10,
        page: pagination.page ? parseInt(pagination.page) + 1 : 1
      });

      if (!projectsDocs) {
        throw new errors.NotFound('No Projects.');
      }

      projectsDocs.docs.forEach(element => {
        element.tabs.filter( d => d.permissionsUserID.every( c => c.includes(user._id)));
      });

      return projectsDocs;
    } catch (error) {
      throw error;
    }
},

标签: javascriptjsonexpressfilter

解决方案


这是一种方法

const data = [...];
const userId = 8;
const result = data.filter((item) => {
    const {tabs} = item;
    let loggedIn = false;
    tabs.forEach((tab) => {
        if (tab.permissionsUserID.includes(userId)) {
            loggedIn = true;
            return true
        }
    })
    return loggedIn;
})

推荐阅读