簡體   English   中英

在 object javascript express 中過濾嵌套數組

[英]Filter nested array in object javascript express

考慮以下 object:

[
  {
    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
  }
]

每個 object 代表一個項目。 一個項目有很多選項卡。

我只想返回至少一個選項卡中包含的項目 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;
    }
},

這是一種方法

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;
})

這是一個簡單的 function,它應該可以滿足您的需求。

Filter()返回項目列表的子集。 如果至少有一個選項卡具有我們要查找的值,則Some()返回 true。 如果 permissionsUserId 列表具有我們想要的用戶 ID,則Includes()返回 true。 將它們鏈接在一起,您將獲得選項卡權限具有所需用戶 ID 的項目子集。

const data = [
        /* list of projects */
    ],
    userId = 8;

function getProjectsForUserId (data, userId) {
    return data.filter((project) => {
        return project.tabs.some((tab) => {
            return tab.permissionsUserID.includes(userId);
        });
    });
}

console.log(getProjectsForUserId(data, 8));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM