为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2019-08-25 23:00:07
问题描述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]));
                            
查看完整回答
反对 回复 2019-08-25
  • 2 回答
  • 0 关注
  • 304 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信