如何使用JavaScript flatMap优化多部门公司数据的拆分逻辑?
按部门拆分公司记录的简洁实现
需求背景
给定如下公司数据结构,需要将每个公司按其所属部门拆分,每个部门对应一条独立的公司记录,记录名称格式为「公司名称 - 部门名称」,其余字段保留原公司的完整信息。
原始数据
var companies = [ {name: 'company 1', depts : ['dept1', 'dept2'], address: 'address1'}, {name: 'company 2', depts : ['dept2', 'dept3'], address: 'address2'}, ];
期望输出
[ {name: 'company 1 - dept1', depts : ['dept1', 'dept2'], address: 'address1'}, {name: 'company 1 - dept2', depts : ['dept1', 'dept2'], address: 'address1'}, {name: 'company 2 - dept2', depts : ['dept2', 'dept3'], address: 'address2'}, {name: 'company 2 - dept3', depts : ['dept2', 'dept3'], address: 'address2'}, ];
现有实现
目前通过两步操作完成需求,但可以进一步简化:
companies.forEach(company => company.displayCompanies = company.depts.map( dept => Object.assign({}, company, {name: `${company.name} - ${dept}`}))) var newCompanies = companies.flatMap(company => company.displayCompanies )
优化后的简洁实现
可以直接用flatMap一步完成映射与扁平化,同时避免修改原数据对象:
const newCompanies = companies.flatMap(company => company.depts.map(dept => ({ ...company, name: `${company.name} - ${dept}` })) );
优化点说明
- 合并了原有的「添加临时属性」和「扁平化」两步操作,逻辑更紧凑
- 使用对象展开语法
{...company}替代Object.assign({}, company),代码更简洁易读 - 不会修改原
companies数组中的对象,保持原始数据的纯净性
内容的提问来源于stack exchange,提问作者Ghassan Karwchan
相关产品推荐
相关产品推荐

