Angular 8中基于多条件过滤对象数组的实现求助
基于lineId、Subfamily和status过滤对象数组的解决方案
需要对对象数组按以下规则过滤:
- 若lineId相同但Subfamily不同,保留两个对象(如lineId为2的两个对象)
- 若lineId和Subfamily相同但status不同,仅保留status为
Submitted的对象(如lineId为3、Subfamily为03的两个对象)
现有代码仅实现了lineId过滤,需添加Subfamily相关逻辑。
响应数据
const data = [ { "Subfamily": "01", "lineId": "2", "status": "Submitted" }, { "Subfamily": "02", "lineId": "2", "status": "Submitted" }, { "Subfamily": "03", "lineId": "3", "status": "Submitted" }, { "Subfamily": "03", "lineId": "3", "status": "New" }, { "Subfamily": "04", "lineId": "4", "status": "New" } ];
预期输出
const output = [ { "Subfamily": "01", "lineId": "2", "status": "Submitted" }, { "Subfamily": "02", "lineId": "2", "status": "Submitted" }, { "Subfamily": "03", "lineId": "3", "status": "Submitted" }, { "Subfamily": "04", "lineId": "4", "status": "New" } ];
现有代码
removeDuplicatesObject(data){ const uniqueResponse = data.reduce((acc, item) => { if (!acc[item.lineId] || item.status === "Submitted") { acc[item.lineId] = item; } return acc; }, {}); const uniqueResponseArray = Object.values(uniqueResponse); return uniqueResponseArray; }
修改后的解决方案
核心调整是用lineId和Subfamily的组合作为累加器的key,以此区分同lineId不同Subfamily的项;同时针对同一key下的不同status,优先保留Submitted状态的对象:
removeDuplicatesObject(data) { const uniqueResponse = data.reduce((acc, item) => { // 生成lineId+Subfamily的组合key,确保同lineId不同Subfamily的对象被分别存储 const key = `${item.lineId}-${item.Subfamily}`; // 逻辑:key不存在则直接存入;若已存在,仅当当前项是Submitted时替换原有值 if (!acc[key] || item.status === "Submitted") { acc[key] = item; } return acc; }, {}); const uniqueResponseArray = Object.values(uniqueResponse); return uniqueResponseArray; }
逻辑说明
- 组合key
${item.lineId}-${item.Subfamily}满足规则1:lineId相同但Subfamily不同的对象会被视为不同条目保留 - 同一key下仅替换为
Submitted项的逻辑满足规则2:当lineId和Subfamily都相同时,Submitted状态会覆盖New状态,最终只保留前者 - 仅存在
New状态的条目(如lineId为4的对象)会正常保留
内容的提问来源于stack exchange,提问作者Shilpa
相关产品推荐
相关产品推荐

