簡體   English   中英

JS-過濾嵌套的對象數組

[英]JS - Filter Nested Array of Objects

樣本JSON數據:

const data = [{
    "_id": "5cc5df25a193c21608666b00",
    "departmentName": "Software Dev",
    "managerId": "5cc5df25a193c21608666b01",
    "managerEmail": "swdmanager@company.com",
    "teams": [{
        "teamName": "SWD Team 1",
        "teamLeadId": "5cc5df25a193c21608666b02",
        "teamLeadEmail": "swdteam1lead@company.com",
        "teamMembers": [{
          "memberId": "5cc5df25a193c21608666b03",
          "memberEmail": "JonDoe1@company.com"
        }]
      },
      {
        "teamName": "SWD Team 2",
        "teamLeadId": "5cc5df25a193c21608666b04",
        "teamLeadEmail": "swdteam2lead@company.com",
        "teamMembers": [{
            "memberId": "5cc5df25a193c21608666b05",
            "memberEmail": "JonDoe2@company.com"
          },
          {
            "memberId": "5cc5df25a193c21608666b06",
            "memberEmail": "JonDoe3@company.com"
          }
        ]
      }
    ]
  },
  {
    "_id": "5cc5df25a193c21608666b07",
    "departmentName": "Software QA",
    "managerId": "5cc5df25a193c21608666b08",
    "managerEmail": "qamanager@company.com",
    "teams": [{
        "teamName": "QA Team 1",
        "teamLeadId": "5cc5df25a193c21608666b09",
        "teamLeadEmail": "qateam1lead@company.com",
        "teamMembers": [{
          "memberId": "5cc5df25a193c21608666b10",
          "memberEmail": "JonDoe4@company.com"
        }]
      },
      {
        "teamName": "QA Team 2",
        "teamLeadId": "5cc5df25a193c21608666b11",
        "teamLeadEmail": "qateam2lead@company.com",
        "teamMembers": []
      },
      {
        "teamName": "QA Team 3",
        "teamLeadId": "5cc5df25a193c21608666b12",
        "teamLeadEmail": "qateam3lead@company.com",
        "teamMembers": [{
            "memberId": "5cc5df25a193c21608666b13",
            "memberEmail": "JonDoe4@company.com"
          },
          {
            "memberId": "5cc5df25a193c21608666b14",
            "memberEmail": "JonDoe5@company.com"
          },
          {
            "memberId": "5cc5df25a193c21608666b15",
            "memberEmail": "JonDoe6@company.com"
          }
        ]
      }
    ]
  },
  {
    "_id": "5cc5df25a193c21608666b16",
    "departmentName": "Software Creative",
    "managerId": "5cc5df25a193c21608666b17",
    "managerEmail": "swcmanager@company.com",
    "teams": []
  },
  {
    "_id": "5cc5df25a193c21608666b18",
    "departmentName": "Software BA",
    "managerId": "5cc5df25a193c21608666b19",
    "managerEmail": "swbamanager@company.com",
    "teams": [{
      "teamName": "BA Team 1",
      "teamLeadId": "5cc5df25a193c21608666b20",
      "teamLeadEmail": "bateam3lead@company.com",
      "teamMembers": []
    }]
  }
];

的jsfiddle

描述:有三個級別。 上層=部門,中層=團隊,下層=團隊成員。 一個部門可以有0個或更多的團隊。 一個團隊可以有0個或更多的團隊成員。

目標:我試圖僅返回teamMembers數組已填充至少一個值的數據。

因此,應該在輸出中消除的是:1)軟件質量檢查/質量檢查小組2-僅質量檢查小組2,因為其他質量檢查小組都有teamMembers 2)軟件創意-整個對象,因為它甚至沒有團隊,更不用說了一個teamMember,以及3)軟件BA-擁有一個團隊,但沒有teamMembers。 這三個對象在teamMembers數組中沒有填充單個值。

我覺得我需要使用Array.prototype.filter()但不確定如何使用嵌套對象(#JSnewbie)。 另外,我現在正在學習JS,所以一些建議以最新的方式來實現。

所需輸出:

[
  {
    "_id": "5cc5df25a193c21608666b00",
    "departmentName": "Software Dev",
    "managerId": "5cc5df25a193c21608666b01",
    "managerEmail": "swdmanager@company.com",
    "teams": [
      {
        "teamName": "SWD Team 1",
        "teamLeadId": "5cc5df25a193c21608666b02",
        "teamLeadEmail": "swdteam1lead@company.com",
        "teamMembers": [
          {
            "memberId": "5cc5df25a193c21608666b03",
            "memberEmail": "JonDoe1@company.com"
          }
        ]
      },
      {
        "teamName": "SWD Team 2",
        "teamLeadId": "5cc5df25a193c21608666b04",
        "teamLeadEmail": "swdteam2lead@company.com",
        "teamMembers": [
          {
            "memberId": "5cc5df25a193c21608666b05",
            "memberEmail": "JonDoe2@company.com"
          },
          {
            "memberId": "5cc5df25a193c21608666b06",
            "memberEmail": "JonDoe3@company.com"
          }
        ]
      }
    ]
  },
  {
    "_id": "5cc5df25a193c21608666b07",
    "departmentName": "Software QA",
    "managerId": "5cc5df25a193c21608666b08",
    "managerEmail": "qamanager@company.com",
    "teams": [
      {
        "teamName": "QA Team 1",
        "teamLeadId": "5cc5df25a193c21608666b09",
        "teamLeadEmail": "qateam1lead@company.com",
        "teamMembers": [
          {
            "memberId": "5cc5df25a193c21608666b10",
            "memberEmail": "JonDoe4@company.com"
          }
        ]
      },
      {
        "teamName": "QA Team 3",
        "teamLeadId": "5cc5df25a193c21608666b12",
        "teamLeadEmail": "qateam3lead@company.com",
        "teamMembers": [
          {
            "memberId": "5cc5df25a193c21608666b13",
            "memberEmail": "JonDoe4@company.com"
          },
          {
            "memberId": "5cc5df25a193c21608666b14",
            "memberEmail": "JonDoe5@company.com"
          },
          {
            "memberId": "5cc5df25a193c21608666b15",
            "memberEmail": "JonDoe6@company.com"
          }
        ]
      }
    ]
  }
]

您可以減少數組,並使用遞歸方法檢查並返回嵌套屬性的數組。

Thge函數filter采用數據數組和嵌套屬性的鍵的數組。 如果想要的鍵的數組包含一些項目,它將返回一個包含項目的數組。

如果還有更多可用的鍵,則將移交並檢查帶有數組的實際屬性。 如果結果不是空數組,則將獲取實際對象的副本以及過濾的結果,然后將該對象推送到結果集中。

如果沒有更多鍵可用,則將不變的對象作為結果集。

 function filter(array, [key, ...keys]) { return array.reduce((r, o) => { if (o[key] && o[key].length) { if (keys.length) { var temp = filter(o[key], keys); if (temp.length) r.push(Object.assign({}, o, { [key]: temp })); } else { r.push(o); } } return r; }, []); } var data = [{ _id: "5cc5df25a193c21608666b00", departmentName: "Software Dev", managerId: "5cc5df25a193c21608666b01", managerEmail: "swdmanager@company.com", teams: [{ teamName: "SWD Team 1", teamLeadId: "5cc5df25a193c21608666b02", teamLeadEmail: "swdteam1lead@company.com", teamMembers: [{ memberId: "5cc5df25a193c21608666b03", memberEmail: "JonDoe1@company.com" }] }, { teamName: "SWD Team 2", teamLeadId: "5cc5df25a193c21608666b04", teamLeadEmail: "swdteam2lead@company.com", teamMembers: [{ memberId: "5cc5df25a193c21608666b05", memberEmail: "JonDoe2@company.com" }, { memberId: "5cc5df25a193c21608666b06", memberEmail: "JonDoe3@company.com" }] }] }, { _id: "5cc5df25a193c21608666b07", departmentName: "Software QA", managerId: "5cc5df25a193c21608666b08", managerEmail: "qamanager@company.com", teams: [{ teamName: "QA Team 1", teamLeadId: "5cc5df25a193c21608666b09", teamLeadEmail: "qateam1lead@company.com", teamMembers: [{ memberId: "5cc5df25a193c21608666b10", memberEmail: "JonDoe4@company.com" }] }, { teamName: "QA Team 2", teamLeadId: "5cc5df25a193c21608666b11", teamLeadEmail: "qateam2lead@company.com", teamMembers: [] }, { teamName: "QA Team 3", teamLeadId: "5cc5df25a193c21608666b12", teamLeadEmail: "qateam3lead@company.com", teamMembers: [{ memberId: "5cc5df25a193c21608666b13", memberEmail: "JonDoe4@company.com" }, { memberId: "5cc5df25a193c21608666b14", memberEmail: "JonDoe5@company.com" }, { memberId: "5cc5df25a193c21608666b15", memberEmail: "JonDoe6@company.com" }] }] }, { _id: "5cc5df25a193c21608666b16", departmentName: "Software Creative", managerId: "5cc5df25a193c21608666b17", managerEmail: "swcmanager@company.com", teams: [] }, { _id: "5cc5df25a193c21608666b18", departmentName: "Software BA", managerId: "5cc5df25a193c21608666b19", managerEmail: "swbamanager@company.com", teams: [{ teamName: "BA Team 1", teamLeadId: "5cc5df25a193c21608666b20", teamLeadEmail: "bateam3lead@company.com", teamMembers: [] }] }], result = filter(data, ['teams', 'teamMembers']); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以過濾沒有團隊的團隊,然后將它們映射到一個新數組,以過濾空團隊。

首先,您必須過濾完全沒有任何團隊和任何團隊成員的團隊。 但是您將剩下沒有團隊成員的團隊。 因此,您必須使用.map僅添加具有團隊成員的團隊。

 const filterEmptyTeams = (data) => data.filter((department) => { const teams = department.teams.filter((team) => team.teamMembers.length > 0) return teams.length !== 0 }).map((department) => { const teams = department.teams.filter((team) => team.teamMembers.length > 0) return {...department, teams} }) const data = [{ "_id": "5cc5df25a193c21608666b00", "departmentName": "Software Dev", "managerId": "5cc5df25a193c21608666b01", "managerEmail": "swdmanager@company.com", "teams": [{ "teamName": "SWD Team 1", "teamLeadId": "5cc5df25a193c21608666b02", "teamLeadEmail": "swdteam1lead@company.com", "teamMembers": [{ "memberId": "5cc5df25a193c21608666b03", "memberEmail": "JonDoe1@company.com" }] }, { "teamName": "SWD Team 2", "teamLeadId": "5cc5df25a193c21608666b04", "teamLeadEmail": "swdteam2lead@company.com", "teamMembers": [{ "memberId": "5cc5df25a193c21608666b05", "memberEmail": "JonDoe2@company.com" }, { "memberId": "5cc5df25a193c21608666b06", "memberEmail": "JonDoe3@company.com" } ] } ] }, { "_id": "5cc5df25a193c21608666b07", "departmentName": "Software QA", "managerId": "5cc5df25a193c21608666b08", "managerEmail": "qamanager@company.com", "teams": [{ "teamName": "QA Team 1", "teamLeadId": "5cc5df25a193c21608666b09", "teamLeadEmail": "qateam1lead@company.com", "teamMembers": [{ "memberId": "5cc5df25a193c21608666b10", "memberEmail": "JonDoe4@company.com" }] }, { "teamName": "QA Team 2", "teamLeadId": "5cc5df25a193c21608666b11", "teamLeadEmail": "qateam2lead@company.com", "teamMembers": [] }, { "teamName": "QA Team 3", "teamLeadId": "5cc5df25a193c21608666b12", "teamLeadEmail": "qateam3lead@company.com", "teamMembers": [{ "memberId": "5cc5df25a193c21608666b13", "memberEmail": "JonDoe4@company.com" }, { "memberId": "5cc5df25a193c21608666b14", "memberEmail": "JonDoe5@company.com" }, { "memberId": "5cc5df25a193c21608666b15", "memberEmail": "JonDoe6@company.com" } ] } ] }, { "_id": "5cc5df25a193c21608666b16", "departmentName": "Software Creative", "managerId": "5cc5df25a193c21608666b17", "managerEmail": "swcmanager@company.com", "teams": [] }, { "_id": "5cc5df25a193c21608666b18", "departmentName": "Software BA", "managerId": "5cc5df25a193c21608666b19", "managerEmail": "swbamanager@company.com", "teams": [{ "teamName": "BA Team 1", "teamLeadId": "5cc5df25a193c21608666b20", "teamLeadEmail": "bateam3lead@company.com", "teamMembers": [] }] } ]; console.log(filterEmptyTeams(data)) 

這是帶有兩個嵌套.reduce()的版本

const result = data.reduce(
  (acc, e) => {
    if (e.teams && e.teams.length > 0) {
      const teams = e.teams.reduce(
        (acc, e) => {
          if (e.teamMembers && e.teamMembers.length > 0) {
            acc.push({...e});
          }
          return acc;
        },
        [],
      );
      if (teams.length > 0) {
        acc.push({...e, teams});
      }
    }
    return acc
  },
  [],
);

暫無
暫無

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

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