如何用JS对多层嵌套对象数组深度扁平化生成Excel导出数据
固定层级嵌套数组扁平化导出Excel实现方案
你现有代码仅完成了客户端到项目层的两层展开,由于你的数据层级固定(客户端 -> 项目 -> 源语言配置 -> 目标语言条目),直接连续使用flatMap逐层拆解数组属性,在最内层目标语言条目处组装行数据即可,逻辑清晰且无额外性能开销。
实现代码
/** * 将多层嵌套的客户项目语言数据扁平化为Excel可用的二维行结构 * @param {Array} rawData 原始嵌套数据 * @returns {Array<Array>} 二维数组,每个子数组对应Excel一行数据 */ const flattenForExcel = (rawData) => { return rawData.flatMap(client => client.projects.flatMap(project => project.languages.flatMap(lang => lang.targets.map(target => [ client.clientName, project.projectName, lang.sourceLanguageName, target.targetLanguageName, target.numItems, target.numItemsSold ]) ) ) ) }
使用说明
- 方法返回标准二维数组结构,可直接传入
xlsx、exceljs等主流Excel导出库使用,无需额外格式转换 - 你给出的期望输出示例存在JSON语法错误:
{"Client One", "Proyect One"...}不是合法JS/JSON结构,二维数组才是表格导出场景的标准数据格式 - 若需要额外保留id、统计值等其他字段,直接在最内层
map的返回数组中按列顺序追加对应属性即可,例如需要客户端id就追加client.idClient
输出结果
传入你提供的原始数据调用方法,输出结果和你的预期完全匹配(修正了你示例中最后一行目标语言的笔误):
[ ["Client One", "Project One", "Spanish", "English", 36, 30], ["Client One", "Project One", "Spanish", "French", 36, 7], ["Client One", "Project Two", "Spanish", "English", 30, 3], ["Client One", "Project Two", "Spanish", "French", 20, 7] ]
如果后续数据层级不固定(比如某层可能动态新增嵌套数组),可以再改成递归通用扁平化方案,但针对你当前固定结构的场景,逐层flatMap的实现可读性和维护性最高。
内容的提问来源于stack exchange,提问作者Aw3same
相关产品推荐
相关产品推荐

