
本文介绍如何使用 javascript 的 reduce 方法,根据指定的程序列表(prglist)遍历对象数组(arrobj),高效提取每个程序对应的所有用户名称,并组织为键值对结构的对象。
本文介绍如何使用 javascript 的 reduce 方法,根据指定的程序列表(prglist)遍历对象数组(arrobj),高效提取每个程序对应的所有用户名称,并组织为键值对结构的对象。
在实际开发中,我们常需将扁平化的对象数组按某字段(如 prg 数组中的元素)进行“反向聚合”——即:不以对象为单位筛选,而是以子项(如程序名)为维度,汇总所有匹配对象的特定属性(如 name)。本例正是典型场景:给定用户对象数组和目标程序列表,要求输出一个以程序名为键、对应用户名数组为值的映射对象。
实现的核心思路是双层归约(nested reduce):
- 外层
reduce遍历prgList,为每个程序key构建结果对象的一个属性; - 内层
reduce遍历arrobj,收集所有prg数组中包含该key的对象的name值。
以下是完整、可直接运行的代码示例:
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, key) => {
const users = arrobj.reduce((list, obj) =>
obj.prg.includes(key) ? [...list, obj.name] : list, []);
return { ...acc, [key]: users };
}, {});
console.log(result);
// 输出:
// {
// onex: ["user1", "user2"],
// twox: ["user1", "user3"],
// threex: ["user1", "user2", "user3"]
// }
✅ 关键说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用
includes()判断单个程序是否存在于用户的prg数组中,语义清晰且兼容性好(ES7+); - 内层
reduce初始化为空数组[],避免副作用,符合函数式编程习惯; - 外层用对象展开语法
{ ...acc, [key]: users }累积结果,简洁安全,无需预先声明空对象; - 整个过程无修改原数组,纯函数式,便于测试与复用。
⚠️ 注意事项:
- 若
prgList中存在重复项,结果中对应键会被覆盖(因对象键唯一),建议提前去重:[...new Set(prgList)]; - 如需支持大小写不敏感匹配,可将
obj.prg.map(String.toLowerCase).includes(key.toLowerCase()); - 对于超大数据集(如
arrobj.length > 10k),可考虑先构建prg → [names]的哈希索引(一次遍历预处理),再按prgList提取,将时间复杂度从 O(M×N) 优化至 O(M+N)。
此方案兼顾可读性、健壮性与性能,是处理此类“多对多逆向映射”问题的推荐实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










