JavaScript筛选对象数组:返回具备全部现有type属性的对象id
实现方案
不需要写复杂的嵌套循环,靠原生Array的内置方法分三步就能实现目标:
- 先把数组里所有不重复的type值统计出来,确定需要覆盖的type总数量——毕竟要找的id必须把所有出现过的type都占全才行。
- 按id做聚合,把同一个id关联的所有type值收集到一起。
- 对比每个id收集到的type数量,和全量type的总数相等的,就是符合要求的id。
用到的核心数组方法
map:遍历数组提取指定字段值,用来拉取全量type、最后把筛选完的id从字符串转成数字类型Set:借助它的去重能力,快速统计不重复type的数量,同时存每个id对应的type集合reduce:用来遍历做按id的分组聚合,比写for循环简洁filter:从聚合结果里筛出符合条件的id
完整可运行代码
const flags = [ { type: "manyCards", id: 1 }, { type: "manyCards", id: 2 }, { type: ":premiumCard", id: 1 }, ] // 1. 统计全量不重复的type总数,作为校验基准 const requiredTypeCount = new Set(flags.map(item => item.type)).size; // 2. 按id聚合,收集每个id对应的所有type const idAccumulator = flags.reduce((group, current) => { // 首次碰到某个id时,初始化一个空集合存它对应的type if (!group[current.id]) group[current.id] = new Set(); group[current.id].add(current.type); return group; }, {}); // 3. 筛选出覆盖了全部type的id,转成数字类型得到最终结果 const result = Object.keys(idAccumulator) .filter(idKey => idAccumulator[idKey].size === requiredTypeCount) .map(idKey => Number(idKey));
结果说明
跑通代码后得到的result值为[1],和示例的预期完全匹配:
- 全量type一共2种,id=1关联的type刚好是这2种,符合要求
- id=2只关联了1种type,没有覆盖全部type,会被过滤掉
内容的提问来源于stack exchange,提问作者csk87
相关产品推荐
相关产品推荐

