比如我有一组数据[{'time':'2018-03-01','data':1,},{'time':'2018-02-02','data':2,},{'time':'2018-01-01','data':3,},{'time':'2017-12-01','data':4,},{'time':'2017-11-02','data':5,},{'time':'2016-10-01','data':6,},{'time':'2016-9-01','data':7,}]实际业务场景是对这组数据进行分组,每5条一组但是这5条还要根据他们的日期年份分小组比如上面这7条分出来结果就是:[{section:1,sectionDatas:[{date:'2018',datas:[{'time':'2018-03-01','data':1,},{'time':'2018-02-02','data':2,},{'time':'2018-01-01','data':3,}]},{date:'2017',datas:[{'time':'2017-12-01','data':4,},{'time':'2017-11-02','data':5,}]}]},{section:2,sectionDatas:[{date:'2016',datas:[{'time':'2016-10-01','data':6,},{'time':'2016-9-01','data':7,}]}]}]这个算法该怎么写呢。。求指教
2 回答
波斯汪
TA贡献1811条经验 获得超4个赞
步骤*第一步:排序,时间从近到远*第二步:分割,将数组分成5个一组,返回新数组*第三步:抽离,将相同时间抽离出来组成要求上的数据格式代码第一步:排序varcompare=function(prop){returnfunction(obj1,obj2){varval1=obj1[prop];varval2=obj2[prop];if(!isNaN(Number(val1))&&!isNaN(Number(val2))){val1=Number(val1);val2=Number(val2);}if(val1return1; }elseif(val1>val2){return-1;}else{return0;}}}//用法arr.sort(compare("time"))第二步:分割//分割Array.prototype.chunk=function(size){vararray=this;constlength=array.lengthif(!length||!size||size<1){return[]}letindex=0letresIndex=0letresult=newArray(Math.ceil(length/size))while(indexresult[resIndex++]=array.slice(index,(index+=size)) }returnresult}//用法arr.chunk(5)第三步:抽离//抽离functionsortArr(arr,str){var_arr=[],_t=[],//临时的变量_tmp;//按照特定的参数将数组排序将具有相同值得排在一起arr=arr.sort(function(a,b){vars=a[str],t=b[str];returns}); if(arr.length){//_tmp=arr[0][str];_tmp=newDate(arr[0][str]).getFullYear()}//将相同类别的对象添加到统一个数组for(leti=0;iif(newDate(arr[i][str]).getFullYear()===_tmp){ //if(arr[i][str]===_tmp){_t.push(arr[i]);}else{_tmp=newDate(arr[i][str]).getFullYear();_arr.push(_t);_t=[arr[i]];}}//将最后的内容推出新数组_arr.push(_t);return_arr;}//用法,这里仅对一维数组使用sortArr(arr,'time')//我将数据一二步处理后开始二叉数循环varcc=arr.sort(compare("time")).chunk(5)var_cc=[]for(leti=0;i//抽离 var_datas=sortArr(cc[i],'time')//根据所给数据结构进行赋值_cc.push({section:i+1,sectionDatas:[]})for(leto=0;o<_datas.length;o++){_cc[i].sectionDatas.push({data:newDate(_datas[o][0].time).getFullYear(),datas:[]})}for(letp=0;p<_cc[i].sectionDatas.length;p++){_cc[i].sectionDatas[p].datas=sortArr(cc[i],'time')[p]}}最近刚研究的函数式编程功力不够,谨慎使用classFunctor{constructor(data){this.data=data}map(data){returnnewFunctor(data)}//排序compare(prop){varresult=this.data.sort(function(obj1,obj2){varval1=obj1[prop];varval2=obj2[prop];if(!isNaN(Number(val1))&&!isNaN(Number(val2))){val1=Number(val1);val2=Number(val2);}if(val1return1; }elseif(val1>val2){return-1;}else{return0;}})returnthis.map(result)}//分割chunk(size){vararray=this.data;//获取数组的长度,如果你传入的不是数组,那么获取到的就是undefinedconstlength=array.length//判断不是数组,或者size没有设置,size小于1,就返回空数组if(!length||!size||size<1){return[]}//核心部分letindex=0//用来表示切割元素的范围startletresIndex=0//用来递增表示输出数组的下标//根据length和size算出输出数组的长度,并且创建它。letresult=newArray(Math.ceil(length/size))//进行循环while(index//循环过程中设置result[0]和result[1]的值。该值根据array.slice切割得到。 result[resIndex++]=array.slice(index,(index+=size))}//输出新数组//returnresultreturnthis.map(result)}//抽离sortArr(arr,str){var_arr=[],_t=[],//临时的变量_tmp;//按照特定的参数将数组排序将具有相同值得排在一起arr=arr.sort(function(a,b){vars=a[str],t=b[str];returns}); if(arr.length){//_tmp=arr[0][str];_tmp=newDate(arr[0][str]).getFullYear()}//将相同类别的对象添加到统一个数组for(leti=0;iif(newDate(arr[i][str]).getFullYear()===_tmp){ //if(arr[i][str]===_tmp){_t.push(arr[i]);}else{_tmp=newDate(arr[i][str]).getFullYear();_arr.push(_t);_t=[arr[i]];}}//将最后的内容推出新数组_arr.push(_t);return_arr;}//转指定json格式dataToJSON(){var_json=[]var_this=this;this.data.forEach(function(item,i){var_datas=_this.sortArr(item,'time')_json.push({section:i+1,sectionDatas:[]})for(leto=0;o<_datas.length;o++){_json[i].sectionDatas.push({data:newDate(_datas[o][0].time).getFullYear(),datas:[]})}for(letp=0;p<_json[i].sectionDatas.length;p++){_json[i].sectionDatas[p].datas=_datas[p]}})return_json}}Functor.of=function(data){returnnewFunctor(data)}使用方法Functor.of(a).compare("time").chunk(5).dataToJSON()//返回一个新的值,不改变原来数据
慕森王
TA贡献1777条经验 获得超3个赞
vararr=newObjectdata.forEach(function(d){varyear=newDate(d.time).getFullYear()if(arr[year]){arr[year].push(d)}else{arr[year]=[d]}})提供个思路,修改一下应该能用
添加回答
举报
0/150
提交
取消