gpt4 book ai didi

javascript - JS - 过滤嵌套的对象数组

转载 作者:行者123 更新时间:2023-11-29 17:36:32 25 4
gpt4 key购买 nike

示例 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) Software QA/QA Team 2 - 只是 QA Team 2,因为其他 QA 团队有 teamMembers 2) Software Creative - 整个对象,因为它甚至没有团队,更不用说团队成员了,以及 3) 软件 BA - 有一个团队,但没有团队成员。这三个对象在 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; }

关于javascript - JS - 过滤嵌套的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55893777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com