如何构建指定结构的数组?现有JS代码输出不符求解决方案
如何构建包含三个子数组的特定结构数组?
我需要构建一种特定结构的数组(content包含三个子数组),但不清楚如何编写对应的函数。我尝试了以下代码,但输出结果与预期存在差异,请问是否有其他实现方式?
const estructuringAccount = (account) => { return account.subaccounts.map(subaccount => { const arraysSubaccount = subaccount.summaries.map(content => { return { [content.type]: [ { month: "january", total: content.january }, { month: "february", total: content.february }, { month: "march", total: content.march }, { month: "april", total: content.april }, { month: "may", total: content.may }, { month: "june", total: content.june }, { month: "july", total: content.july }, { month: "august", total: content.august }, { month: "september", total: content.september }, { month: "october", total: content.october }, { month: "november", total: content.november }, { month: "december", total: content.december } ] } }) return { key: subaccount.id, name: subaccount.name, content: [{ year: subaccount.summaries[0].year, summary: subaccount.summaries[0].summary, ...arraysSubaccount }] } }) }
问题分析
你的代码核心问题在于:
arraysSubaccount是对象数组,但你用展开运算符...arraysSubaccount将其合并到单个对象中,未形成content需要的子数组结构- 仅提取了
summaries[0]的year和summary,忽略了其他summaries条目的对应值 - 重复编写12个月份的代码,冗余且不易维护
解决方案
根据content包含三个子数组的需求,分两种场景给出实现:
场景1:content的每个子数组对应一个summaries条目
如果每个summaries条目对应content的一个子元素,每个子元素包含year、summary和对应type的月度数据,代码可优化为:
const estructuringAccount = (account) => { // 定义月份列表,避免重复代码 const months = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]; return account.subaccounts.map(subaccount => { // 直接将每个summary转换为content的子数组元素 const content = subaccount.summaries.map(summary => ({ year: summary.year, summary: summary.summary, [summary.type]: months.map(month => ({ month, total: summary[month] })) })); return { key: subaccount.id, name: subaccount.name, content }; }); };
场景2:content是单元素数组,内部对象包含三个type的月度数组
如果content是一个数组,里面的单个对象需要整合所有summaries的type数据,代码可调整为:
const estructuringAccount = (account) => { const months = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]; return account.subaccounts.map(subaccount => { // 用reduce合并所有summary的type数据到一个对象 const mergedSummary = subaccount.summaries.reduce((acc, summary) => { acc[summary.type] = months.map(month => ({ month, total: summary[month] })); // 假设所有summary的year和summary值一致,若不一致需按需调整 acc.year = summary.year; acc.summary = summary.summary; return acc; }, {}); return { key: subaccount.id, name: subaccount.name, content: [mergedSummary] }; }); };
内容的提问来源于stack exchange,提问作者Leandro Morocho Soca
相关产品推荐
相关产品推荐

