问题描述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三层复杂度很高有没有算法简单点的处理方式
2 回答
阿晨1998
TA贡献2037条经验 获得超6个赞
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]));
添加回答
举报
0/150
提交
取消