
本文介绍如何基于给定的程序名称列表(如 ["onex", "twox", "threex"]),从对象数组中筛选出所有包含对应程序的用户名称,并按程序名聚合为键值对结构,最终输出符合预期的映射对象。
本文介绍如何基于给定的程序名称列表(如 `["onex", "twox", "threex"]`),从对象数组中筛选出所有包含对应程序的用户名称,并按程序名聚合为键值对结构,最终输出符合预期的映射对象。
在实际开发中,我们常需根据多维条件(如数组内包含关系)对数据进行反向索引——即“由标签查实体”。本例中,目标是将 prgList 中每个程序作为键,收集所有 arrobj 中 prg 数组包含该程序的用户 name,形成结构化的分组结果。
核心思路是:遍历 prgList,对每个程序项,在 arrobj 中查找所有匹配的用户,并提取其 name 字段,最终组合为对象。推荐使用函数式方法 Array.prototype.reduce() 实现,兼顾可读性与性能:
const arrobj = [
{ id: 1, name: "user1", prg: ["onex", "twox", "threex"] },
{ id: 2, name: "user2", prg: ["onex", "threex"] },
{ id: 3, name: "user3", prg: ["twox", "threex"] }
];
const prgList = ["onex", "twox", "threex"];
const result = prgList.reduce((acc, program) => {
const users = arrobj
.filter(obj => obj.prg.includes(program))
.map(obj => obj.name);
return { ...acc, [program]: users };
}, {});
console.log(result);
// 输出:
// {
// onex: ["user1", "user2"],
// twox: ["user1", "user3"],
// threex: ["user1", "user2", "user3"]
// }
✅ 关键说明:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 使用
filter()+includes()替代原始尝试中的find(),因为find()仅返回首个匹配项,而我们需要全部匹配用户; -
map()紧随filter()提取name,语义清晰、链式自然; - 外层
reduce()初始化空对象{},每次迭代通过计算属性名[program]动态添加键值对; - 若
prgList存在重复项或arrobj较大,可考虑预先构建prg → [names]的 Map 缓存以提升多次查询性能(进阶优化场景)。
⚠️ 注意事项:
-
includes()区分大小写且要求完全匹配,若需模糊匹配或忽略大小写,请改用some(item => item.toLowerCase().includes(program.toLowerCase()))等逻辑; - 若
prg字段可能为undefined或非数组类型,建议增加防御性检查:Array.isArray(obj.prg) && obj.prg.includes(program); - 此方案时间复杂度为 O(M × N)(M =
prgList.length, N =arrobj.length),对万级数据仍表现良好;超大规模场景建议转为哈希预处理(如构建new Map<string string></string>)。
该模式广泛适用于权限分组、标签归档、多选筛选等业务场景,掌握后可灵活迁移至 Vue/React 数据处理逻辑中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










