数据格式的转换问题求大佬指点!

问题描述
constdata=[
{
month:'2019-01',
list:[
{name:'语文',share:98},
{name:'数学',share:89},
{name:'其它',share:45},
]
},
{
month:'2019-02',
list:[
{name:'外语',share:34},
{name:'数学',share:56},
{name:'其它',share:33},
]
}
]
转换成
[
['month','2019-01','2019-02'],
['语文',98,0],
['数学',89,56],
['外语',0,34],
['其它',45,33],
]
问题出现的环境背景及自己尝试过哪些方法
相关代码
//请把代码文本粘贴到下方(请勿用图片代替代码)我考虑先把所有科目都找出来
//取出所有类目
constALL=[
...newSet(
monthList&&
monthList
.map(i=>i.list)
.flat(1)
.map(j=>j.name)
),
];
想的是ALL.map()结果发现至少要map三层复杂度很高有没有算法简单点的处理方式
慕尼黑5688855
浏览 305回答 2
2回答

阿晨1998

constdata=[];//原数据constresult=data.reduce(({months,names},{month,list},index)=>{months.push(month);list.forEach(v=>{if(!names[v.name])names[v.name]={};names[v.name][month]=v.share;});if(index===data.length-1){return[['month',...months],...Object.keys(names).map(name=>[name,...months.map(_month=>names[name][_month]||0),]),];}return{months,names};},{months:[],names:{}});console.log(result);写完发现这个解决方式复杂度还是挺高的,应该还有更优解再提供一个解决方式,先提取names,逻辑简单得多constresult=data.reduce((ary,{month,list})=>{ary.forEach((arr,i)=>{letv=i?list.find(v=>v.name===arr[0]):month;arr.push(i?(v?v.share:0):v);});returnary;},[...newSet(['month',...data.flatMap(v=>v.list.map(v=>v.name))])].map(v=>[v]));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript