如何将对象数组转换为按部门合并名称的短数组?
按部门合并对象数组中的名称字段
原始数组
[ { department:"Reviewer", name:"John" }, { department:"Reviewer", name:"Carol" }, { department:"Reviewer", name:"June" }, { department:"Assistant Reviewer", name:"Mac" }, { department:"Assistant Reviewer", name:"Issac" } ]
期望转换结果
[ { department:"Reviewer", name:"John;Carol;June;" }, { department:"Assistant Reviewer", name:"Mac;Issac;" }, ]
你的代码问题分析
你之前的写法存在两处关键问题:
new Set(obj.department)语法错误,obj是数组,无法直接取department属性,应该先遍历数组提取每个元素的department值- map回调里的逻辑没有关联部门与对应名称的关系,也未实现同部门名称的累加拼接
正确实现方法
方法一:使用reduce高效分组(推荐)
const arr = [ { department:"Reviewer", name:"John" }, { department:"Reviewer", name:"Carol" }, { department:"Reviewer", name:"June" }, { department:"Assistant Reviewer", name:"Mac" }, { department:"Assistant Reviewer", name:"Issac" } ]; // 按部门分组,收集对应名称数组 const groupedData = arr.reduce((accumulator, current) => { // 若当前部门未在分组中,初始化空数组 if (!accumulator[current.department]) { accumulator[current.department] = []; } // 将当前名称加入对应部门的数组 accumulator[current.department].push(current.name); return accumulator; }, {}); // 将分组对象转换为目标数组格式 const mergedResult = Object.entries(groupedData).map(([dept, names]) => ({ department: dept, name: names.join(';') + ';' // 拼接名称并添加末尾分号 })); console.log(mergedResult);
方法二:先取唯一部门再拼接名称(逻辑直观)
const arr = [/* 原始数组 */]; // 获取所有唯一部门 const uniqueDepartments = [...new Set(arr.map(item => item.department))]; // 遍历每个部门,筛选并拼接对应名称 const mergedResult = uniqueDepartments.map(dept => ({ department: dept, name: arr .filter(item => item.department === dept) .map(item => item.name) .join(';') + ';' }));
两种方法都能实现需求,方法一的reduce只遍历数组一次,性能更优;方法二逻辑更易懂,适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者C Sharper
相关产品推荐
相关产品推荐

