如何基于参考数组过滤含嵌套数组属性的对象数组
数组交叉匹配过滤实现方案
原代码失效原因
你之前使用的 planning.filter(item => checked.includes(item.equipe)) 无法达到预期效果,核心是对includes方法的匹配规则认知偏差:includes 方法用于检查传入的参数是否为目标数组的直接一级元素。这里传入的item.equipe本身是一个嵌套子数组,而checked数组存储的是字符串格式的组ID,二者结构不匹配,因此永远无法命中匹配条件。
可直接落地的实现代码
基础通用写法(适配中小数据量)
通过Array.some方法遍历当前计划项的equipe子数组,只要任意一个组ID存在于checked选中列表中,就保留该计划项:
const filteredPlanning = planning.filter(item => { return item.equipe.some(teamId => checked.includes(teamId)) })
用你提供的测试数据验证执行逻辑:
- 计划项
{ id: '1', equipe: [ '1', '2' ] }:equipe中的'1'存在于checked数组,予以保留 - 计划项
{ id: '2', equipe: [ '1' ] }:equipe中的'1'存在于checked数组,予以保留 - 计划项
{ id: '3', equipe: [ '2', '3' ] }:equipe中的所有元素均不存在于checked数组,予以过滤
最终输出的结果和你预期的目标数组完全一致。
性能优化写法(适配大数据量场景)
如果planning条目数达到百条以上,可提前将checked数组转为Set结构,把单次匹配的时间复杂度从O(n)降至O(1),减少重复遍历的性能开销:
// 提前构建选中集合,避免每次匹配重复遍历checked数组 const checkedTeamSet = new Set(checked) const filteredPlanning = planning.filter(item => { return item.equipe.some(teamId => checkedTeamSet.has(teamId)) })
内容的提问来源于stack exchange,提问作者Lokomass
相关产品推荐
相关产品推荐

