React JS多条件统计嵌套数组元素总数问题排查
问题描述
需要从给定的嵌套参与者数组中,统计同时满足以下两个条件的人员总数:
- 参与者自身的
Pocu属性值为"Da" - 参与者关联的
Cursuri数组中,存在Nume属性值为"Contabilitate"的课程项
原有实现代码如下:
let popular = JSON.parse(`[ { "id": "15f806ec-79cf-498f-8a4d-8bc8fdf8c43e", "Nume": "negrea", "Prenume": "ioana", "Pocu": "Da", "createdAt": "2022-04-27T13:17:05.000Z", "updatedAt": "2022-04-27T13:17:05.000Z", "deletedAt": null, "INDICATORI": [ { "id": "068170b3-7995-41df-8fac-4f2bc577e2c6", "Nume": "4S110", "importHash": null } ], "Cursuri": [ { "id": "068170b3-7995-41df-8fac-4f2bc577e2c6", "Nume": "Contabilitate", "importHash": null } ] } ]`); const count = popular.reduce((total, participant) => total + Math.min (participant.Cursuri .filter(indicator => indicator.Nume === "Contabilitate").length, popular .filter(indicator => indicator.Pocu === "Da").length), 0) console.log(count);
运行上述代码得到的输出为85,但预期正确结果应为20。
问题根因
代码逻辑存在两处核心错误,直接导致统计结果失真:
- 判断范围错误:遍历单个参与者时,反复对整个
popular数组执行filter统计全量Pocu === "Da"的人数,完全没有判断当前遍历到的参与者自身的Pocu属性是否符合要求 - 累加逻辑错误:错误使用
Math.min取「当前参与者匹配Contabilitate的课程数量」和「全量Pocu符合条件的总人数」的最小值做累加,只要参与者有Contabilitate课程,就会累加一个远大于1的数值,最终结果自然严重偏大。
修复方案
调整reduce的判断逻辑,遍历每个参与者时仅针对当前对象做两个条件的校验,两个条件同时满足时计数加1即可,修复后代码如下:
const count = popular.reduce((total, participant) => { // 校验当前参与者Pocu属性是否符合要求 const matchPocu = participant.Pocu === "Da"; // 校验当前参与者是否关联了Contabilitate课程 const matchCourse = participant.Cursuri.some(curs => curs.Nume === "Contabilitate"); // 两个条件同时满足则总数+1,否则加0 return total + (matchPocu && matchCourse ? 1 : 0); }, 0); console.log(count);
注:判断数组是否存在符合条件的项时,用
some()比filter().length效率更高,找到第一个匹配项就会终止遍历,不需要遍历整个数组。
内容的提问来源于stack exchange,提问作者CCI BN
相关产品推荐
相关产品推荐

