[英]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": []
}]
}
];
描述:有三个级别。 上层=部门,中层=团队,下层=团队成员。 一个部门可以有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.